【问题标题】:In R, how can I loop over repeated XML nodes, and save text values in a list?在 R 中,如何遍历重复的 XML 节点,并将文本值保存在列表中?
【发布时间】:2018-04-03 04:56:43
【问题描述】:

我正在处理来自 Clinicaltrials.gov 的 XML 文件,其结构如下:

<clinical_study>
  ...
  <brief_title>
  ...
  <location>
    <facility>
      <name>
      <address>
        <city>
        <state>
        <zip>
        <country>
    </facility>
  </location>
  <location>
    ...
  </location>
  ...
</clinical_study>

我正在从多个 XML 文件中收集信息,因此每个文件中的位置数量是未知的,甚至可能为零。我需要提取有关每个位置的所有信息并保存到 SQL 表中。我已经使用 XML 包中的函数从单个节点中提取信息取得了一些成功,例如

library(XML)
nct_url <- "http://clinicaltrials.gov/ct2/show/NCT00112281?resultsxml=true"
xml_doc <- xmlParse(nct_url, useInternalNode=TRUE)
title_path <- "/clinical_study/brief_title" 
title_text <- xpathSApply(xml_doc, title_path, xmlValue)

我正在尝试使用 getNodeSet,这给了我一组正确的长度:

doc <- xmlParse("NCT00007501.xml")
locations <- getNodeSet(doc, "/clinical_study/location")
length(locations)
[1] 22
> class(locations)
[1] "XMLNodeSet"

但我从这组数据中提取信息的尝试大多没有结果。有什么建议吗?

【问题讨论】:

    标签: xml r


    【解决方案1】:

    这是一个例子

     ns <- getNodeSet(xml, '//clinical_results/outcome_list/outcome/analysis_list/analysis/method')
     element_cnt <-length(ns))
     strings<-paste(sapply(ns, function(x) { xmlValue(x) }),collapse="|"))
    

    【讨论】:

    • 好建议。谢谢。
    【解决方案2】:

    此代码会将与临床试验中的&lt;location&gt; 对应的节点子集放入数据框中:

    library(XML)
    clinicalTrialUrl <- "http://clinicaltrials.gov/ct2/show/NCT01480479?resultsxml=true"
    xmlDoc <- xmlParse(clinicalTrialUrl, useInternalNode=TRUE)
    locations <- xmlToDataFrame(getNodeSet(xmlDoc,"//location"))
    

    在这种情况下,有 221 个位置。但是,该代码假定某种扁平结构并将子节点集中在一起。例如,&lt;facility&gt; 下的任何内容都被连接成一个字符串。我可以进入子节点并将它们一一放入数据框中。

    【讨论】:

    • 上述解决方案存在一个问题,即子节点被连接成单个长字符串。我在另一个帖子里问了这个问题,它得到了回答。一种有效的解决方案是扁平化 XML 的结构以适当地适应表格。这是线程:stackoverflow.com/questions/22625960/…
    【解决方案3】:

    我不明白您为什么不再使用 xpathSApply 来检索您已经为标题所做的位置?!

    xpathSApply(xml_doc, "//clinical_study/location" , xmlValue)
    

    【讨论】:

    • 节点包含子节点,而 xmlValue 只是删除标签并将所有值连接在一起而没有分隔符。如果我想要的只是 节点,那么您的建议很好,并且会返回所有位置标题的列表。从您的建议末尾去掉“xmlValue”会给我一个 XML 片段列表,但是像 xmlParse 这样的 XML 函数需要一个文件。不确定如何处理 XML 片段。
    • 在您的帮助下,我可能已经回答了我自己的问题。如果我将一组 XML 片段保存在一个列表中,那么我似乎可以再次将 xpathSApply 与上面有“xml_doc”的“list[1]”一起使用。谢谢。
    • 使用 dput(object) 查看对象的结构。另外,请注意,您可以使用 xmlParse 和 xmlTreeParse 两种方法准备 XML 文件。它们产生不同的输出。然而内部节点是/否。很难理解这一切。我希望 XML 包有更多的傻瓜小插曲和 3 多个针对每个问题的示例。
    • 上面的参数应该是"//clinical_study/location"。 (双斜杠)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 2012-12-02
    • 2021-06-22
    • 1970-01-01
    • 2021-10-02
    • 2019-06-23
    相关资源
    最近更新 更多