R语言中使用XPath获取无子节点的节点父节点名称失败如何解决
核心原因
R语言XML包的getNodeSet()返回的是XML节点对象列表,直接调用names(a)获取的是R列表本身的属性名,而非XML节点的自身名称,同时你的XPath会因为单个父节点存在多个叶子子节点被重复匹配,需要去重才能得到预期结果。
调整方案
方案1:先提取节点再批量获取名称
library(XML) xml_doc <- ("<ca> <ai>67400000</ai> <ssci>FN</ssci> <aa> <ta>1280</ta> <tc>EUR</tc> </aa> </ca>") xml_parsed <- xmlParse(xml_doc) # 获取所有叶子节点的父节点集合 parent_nodes <- getNodeSet(xml_parsed, "//*[not(*)]/parent::*") # 遍历节点集合提取名称后去重,倒序排序得到aa在前的结果 parent_names <- sort(unique(sapply(parent_nodes, xmlName)), decreasing = TRUE) # 转为逗号分隔的字符串输出 cat(paste(parent_names, collapse = ", "))
运行后输出结果为:aa, ca,符合预期。
方案2:直接通过XPath返回名称
使用xpathSApply()直接接收XPath返回的名称值,无需额外解析节点:
parent_names <- sort(unique(xpathSApply(xml_parsed, "//*[not(*)]/parent::*/name()")), decreasing = TRUE)
内容的提问来源于stack exchange,提问作者MLEN
相关产品推荐
相关产品推荐

