Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在R中处理空XML节点_Xml_R_Xmlnode_Xml Attribute - Fatal编程技术网

在R中处理空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

我有以下XML文件(我缺少根节点,但编辑器不允许我--请假设这里有根节点):


使用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>