我有以下的XML文件(我缺少根节点,但编辑器不允许我添加——请假设这里有一个根节点):
<Indvls>
<Indvl>
<Info lastNm="HANSON" firstNm="LAURIE"/>
<CrntEmps>
<CrntEmp orgNm="ABC INCORPORATED" str1="FOURTY FOUR BRYANT PARK" city="NEW YORK" state="NY" cntry="UNITED STATES" postlCd="10036">
<BrnchOfLocs>
<BrnchOfLoc str1="833 NE 55TH ST" city="BELLEVUE" state="WA" cntry="UNITED STATES" postlCd="98004"/>
</BrnchOfLocs>
</CrntEmp>
</CrntEmps>
</Indvl>
<Indvl>
<Info lastNm="JACKSON" firstNm="SHERRY"/>
<CrntEmps>
<CrntEmp orgNm="XYZ INCORPORATED" str1="3411 GEORGE STREET" city="SAN FRANCISCO" state="CA" cntry="UNITED STATES" postlCd="94105">
<BrnchOfLocs>
</BrnchOfLocs>
</CrntEmp>
</CrntEmps>
</Indvl>
</Indvls>
使用R语言,我想提取以下列并以表格形式呈现: (a) /Info节点中的lastNm和firstNm--始终具有值; (b) /CrntEmps/CrntEmp节点中的orgNm--始终具有值;以及 (c) /CrntEmps/BrnchOfLocs/BrnchofLoc节点中的str1、city和state--可能具有值或不具有值(在我的示例中,第二个实体没有办公地址)。
我的挑战是许多节点将没有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)
)
}))