在R中处理空XML节点
我有以下XML文件(我缺少根节点,但编辑器不允许我--请假设这里有根节点):在R中处理空XML节点,xml,r,xmlnode,xml-attribute,Xml,R,Xmlnode,Xml Attribute,我有以下XML文件(我缺少根节点,但编辑器不允许我--请假设这里有根节点): 使用R,我想以表的形式提取以下列: (a) 来自/Info节点的lastNm和firstNm——始终带有值; (b) 来自/CrntEmps/CrntEmp节点的orgNm——始终带有值;和 (c) str1、city、state from/CrntEmps/BrnchOfLocs/BrnchofLoc node——可能有值也可能没有值(在我的示例中,第二个实体没有办公室位置地址) 我的挑战是,许多节点将不具有Br
使用R,我想以表的形式提取以下列:
(a) 来自/Info节点的lastNm和firstNm——始终带有值;
(b) 来自/CrntEmps/CrntEmp节点的orgNm——始终带有值;和
(c) str1、city、state from/CrntEmps/BrnchOfLocs/BrnchofLoc node——可能有值也可能没有值(在我的示例中,第二个实体没有办公室位置地址)
我的挑战是,许多节点将不具有BrnchOfLoc节点。我想创建一个条目,即使节点丢失(否则表是不平衡的,在数据帧中创建时会出错)
有什么想法或建议吗?我感谢你的任何意见
附录:这是我的代码:
xmlGetNodeAttr <- function(n, xp, attr, default=NA) {
ns<-getNodeSet(n, xp)
if(length(ns)<1) {
return(default)
} else {
sapply(ns, xmlGetAttr, attr, default)
}
}
do.call(rbind, lapply(xmlChildren(xmlRoot(doc)), function(x) {
data.frame(
fname=xmlGetNodeAttr(x, "//Info","firstNm",NA),
lname=xmlGetNodeAttr(x, "//Info","lastNm",NA),
orgname=xmlGetNodeAttr(x,"//CrntEmps/CrntEmp[1]","orgNm",NA),
zip=xmlGetNodeAttr(x, "//CrntEmps/CrntEmp[1]/BrnchOfLocs/BrnchOfLoc[1]","city",NA)
)
}))
xmlGetNodeAttr您应该这样做
do.call(rbind, lapply(xmlChildren(xmlRoot(doc)), function(x) {
data.frame(
fname=xmlGetNodeAttr(x, "./Info","firstNm",NA),
lname=xmlGetNodeAttr(x, "./Info","lastNm",NA),
orgname=xmlGetNodeAttr(x, "./CrntEmps/CrntEmp[1]","orgNm",NA),
zip=xmlGetNodeAttr(x, "./CrntEmps/CrntEmp[1]/BrnchOfLocs/BrnchOfLoc[1]","city",NA)
)
}))
注意使用/
而不是/
。后者将在整个文档中搜索,忽略您正在覆盖的当前节点。使用/
将从当前的x
节点开始,只查看子节点。这是回报
fname lname orgname zip
Indvl LAURIE HANSON ABC INCORPORATED BELLEVUE
Indvl1 SHERRY JACKSON XYZ INCORPORATED <NA>
fname lname orgname zip
Indvl LAURIE HANSON ABC有限公司BELLEVUE
Indvl1雪莉杰克逊XYZ公司
您在做什么?如何创建数据框?我想你已经写了一些R代码了。这将是一个很好的主意,以及张贴。我使用了你的一个功能,从早期的线程。你可以编辑你的原始问题,包括在那里。它的格式会更好。谢谢。是我干的。希望它现在是可见和易读的。我面临着整个BrnchofLoc节点和子节点(BrnchofLoc)丢失的情况。这段代码在这一点上遇到了问题。思想?我非常感谢你在这个问题上的意见。谢谢。在那种情况下,效果似乎完全一样。您遇到了什么“问题”?好吧-让我在XML文件和代码中尝试一些变体,看看是否仍然遇到当前问题(仅显示一行,所有行都带有NA值)。再次感谢。如果我从上面的示例中取出
,效果会很好。确保您的示例数据重现了您遇到的问题。@user3808860我想您忘记发布解决方案了
fname lname orgname zip
Indvl LAURIE HANSON ABC INCORPORATED BELLEVUE
Indvl1 SHERRY JACKSON XYZ INCORPORATED <NA>