【问题标题】:R: How to search for XML NodeR:如何搜索 XML 节点
【发布时间】:2014-07-06 04:16:14
【问题描述】:

我有一个包含个人姓名和当前工作公司的 XML 文件,模型如下:

 <Indvl>
      <Info lastNm="Smith" firstNm="John" midNm="Patrick"/>
      <CrntEmps>
        <CrntEmp orgNm="ABC Incorporated" str1="1000 Main Street" city="Helena" state="MT" cntry="UNITED STATES" >
        </CrntEmp>
      </CrntEmps>
</Indvl/>
 <Indvl>
      <Info lastNm="Wesley" firstNm="Jackie" midNm="Jonas"/>
      <CrntEmps>
        <CrntEmp orgNm="XYZ Incorporated" str1="1000 Main Street" city="Helena" state="MT" cntry="UNITED STATES" >
        </CrntEmp>
        <CrntEmp orgNm="Sub Contractor1" str1="1000 Some Street" city="Lincoln" state="NB" cntry="UNITED STATES" >
        </CrntEmp>
      </CrntEmps>
</Indvl/>

我有兴趣在一张表中提取个人的姓名信息,我能够做到这一点。

我也有兴趣提取他们第一个显示的雇主(如在 CrntEmp 标记中)。大多数情况下只有一个,但有些情况下有两个。但我只想提取他们的第一个雇主:

对于约翰·帕特里克·史密斯:ABC Incorporated 对于 Jackie Jonas Wesley:XYZ 公司

关于如何在 R 中轻松实现这一点有什么想法吗?非常感谢您的意见 - 谢谢。

【问题讨论】:

  • 请使您的数据自包含(没有根节点)并显示您使用的代码,以确保它适用于示例数据。

标签: xml r


【解决方案1】:

好吧,如果它是 XML,那么使用 XML 库将是最简单的。您的示例数据的唯一问题是没有根节点。应该有一个根来正确解析您的数据。这里我将添加一个名为“root”的

sxml<-'<root><Indvl>
      <Info lastNm="Smith" firstNm="John" midNm="Patrick"/>
      <CrntEmps>
        <CrntEmp orgNm="ABC Incorporated" str1="1000 Main Street" city="Helena" state="MT" cntry="UNITED STATES" >
        </CrntEmp>
      </CrntEmps>
</Indvl>
 <Indvl>
      <Info lastNm="Wesley" firstNm="Jackie" midNm="Jonas"/>
      <CrntEmps>
        <CrntEmp orgNm="XYZ Incorporated" str1="1000 Main Street" city="Helena" state="MT" cntry="UNITED STATES" >
        </CrntEmp>
        <CrntEmp orgNm="Sub Contractor1" str1="1000 Some Street" city="Lincoln" state="NB" cntry="UNITED STATES" >
        </CrntEmp>
      </CrntEmps>
</Indvl></root>'

现在我们可以加载和解析这些数据了

library(XML)
doc<-xmlParse(sxml, asText=TRUE)

现在我们有了一个 XML 对象。我们可以遍历个体(&lt;Indvl&gt; 节点)并提取 Info 和第一个 CrntEmp 节点。

xpathApply(doc,"/root/Indvl", function(x) { 
    list(
        indivInfo = xpathSApply(x,"Info/@*"),
        empInfo = xpathSApply(x,"CrntEmps/CrntEmp[1]/@*")
    )   
})

我们在这里使用标准的 xpath 表达式来查找我们想要的数据。在这里,我为每个人返回一个列表,看起来像

[[1]]
[[1]]$indivInfo
   lastNm   firstNm     midNm 
  "Smith"    "John" "Patrick" 

[[1]]$empInfo
             orgNm               str1               city              state 
"ABC Incorporated" "1000 Main Street"           "Helena"               "MT" 
             cntry 
   "UNITED STATES" 


[[2]]
[[2]]$indivInfo
  lastNm  firstNm    midNm 
"Wesley" "Jackie"  "Jonas" 

[[2]]$empInfo
             orgNm               str1               city              state 
"XYZ Incorporated" "1000 Main Street"           "Helena"               "MT" 
             cntry 
   "UNITED STATES" 

因此您可以轻松地以 R 友好的列表形式而不是 XML 访问该数据。

【讨论】:

    【解决方案2】:

    假设您一直在使用 XML 包,因此假设 doc 是解析后的文本:

    xp <- c("//Info", "//CrntEmps/CrntEmp[1]")
    L <- lapply(xp, xpathSApply, doc = doc, fun = xmlAttrs) # list
    t(do.call(rbind, L)) # reform into a matrix
    
    ##     lastNm   firstNm  midNm     orgNm              str1               city     state cntry          
    ## [1,] "Smith"  "John"   "Patrick" "ABC Incorporated" "1000 Main Street" "Helena" "MT"  "UNITED STATES"
    ## [2,] "Wesley" "Jackie" "Jonas"   "XYZ Incorporated" "1000 Main Street" "Helena" "MT"  "UNITED STATES"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多