在R中为XML节点添加兄弟节点时出现格式异常的问题排查
问题原因及解决方法
为什么会出现额外的<和/>符号?
你直接将XML格式的字符串<a3>string</a3>传给xml_add_sibling函数时,该函数会把这个字符串当作普通文本内容处理,而不是解析成XML节点。XML规范中,<、>这类特殊字符会被自动转义(<转成<,>转成>),最终就出现了<<a3>string</a3>/>这种被错误转义的结构。
正确的实现方式
要添加兄弟节点,需要传入XML节点对象,而不是字符串。有两种常用方法:
方法1:先将字符串解析为XML节点再添加
先把要添加的XML字符串解析成节点对象,再传给xml_add_sibling:
library(xml2) x <- read_xml("<a><a1>123</a1> <a2>222</a2> </a>") # 解析XML字符串并提取节点 a3_node <- read_xml("<a3>222</a3>") %>% xml_child() # 选中a2节点,添加兄弟节点a3 xml_add_sibling(xml_find_first(x, ".//a2"), a3_node) # 查看结果 x
方法2:直接通过参数创建节点
xml_add_sibling支持直接指定节点名称和文本内容,无需手动写XML字符串:
library(xml2) x <- read_xml("<a><a1>123</a1> <a2>222</a2> </a>") # 直接创建并添加a3节点到a2后面 xml_add_sibling(xml_find_first(x, ".//a2"), "a3", "222") # 查看结果 x
注意:你的原代码中xml_child(x)选中的是第一个子节点a1,所以会把a3加到a1后面。如果要加到a2后面,需要明确选中a2节点(比如用xml_find_first(x, ".//a2")或xml_children(x)[[2]])。
内容的提问来源于stack exchange,提问作者Zhilong Jia
相关产品推荐
相关产品推荐

