【问题标题】:In R, how do I combine two XML documents into one document?在 R 中,如何将两个 XML 文档合并为一个文档?
【发布时间】:2017-04-18 01:00:09
【问题描述】:

我正在从基于 XML 的 API 查询数据。 API 响应是分页的,所以我必须进行一堆查询才能获得完整的数据集。

使用xml2 包中的read_xml,我可以轻松地发出每个请求并将其保存为XML 文档,但我一直无法弄清楚如何使用该库将它们组合成一个文档。 (我想这样做,这样我就可以进行一次我需要进行的 Xpath 查询,而不是 50 次。)

我尝试创建一个新的空白文档并将其他节点的节点添加为元素,但 xml_add_childxml_add_sibling 函数将第二个文档作为参数,并且似乎都不喜欢传递结果xml_find_all 查询。 (他们抱怨无法使用参考资料。)

所以,我被难住了。

(注意:我也没有成功地发现如何使用原始 XML 包做到这一点。)

【问题讨论】:

    标签: r xml


    【解决方案1】:

    经过反复试验,我想出了如何使用 xml2 包做到这一点。

    让我们考虑两个非常简单的 XML 文档的简单案例,我们希望将它们组合在一起。

    doc1 <- read_xml("<items><item>1</item><item>2</item><items>")
    doc2 <- read_xml("<items><item>3</item><item>4</item><items>")
    

    (注意:文件来自哪里无关紧要,read_xml 的参数是它可以读取的任何内容。)

    要将它们组合在一起,只需执行以下操作:

    doc2children <- xml_children(doc2)
    
    for (child in doc2children) {
        xml_add_child(doc1, child)
    }
    

    现在,当您查看 doc1 时,您应该会看到:

    > doc1
    {xml_document}
    <items>
    [1] <item>\n  1</item>
    [2] <item>\n  2</item>
    [3] <item>\n  3</item>
    [4] <item>\n  4</item>
    

    【讨论】:

      【解决方案2】:

      考虑使用 XML 包使用 &lt;root&gt; 初始化一个空文档,并使用 addChildren() 方法从每个 XML 的根目录迭代地附加其他 XML 内容。

      library(XML)
      
      doc = newXMLDoc()
      root = newXMLNode("root", doc = doc)
      
      # LOOP THROUGH 50 REQUESTS
      lapply(seq(50), function(i) {
          # PARSE ALL CONTENT
          tmp <- xmlParse("/path/to/API/call")
      
          # APPEND FROM API XML ROOT
          addChildren(root, getNodeSet(tmp, '/apixmlroot'))
      })
      
      # SAVE TO FILE OR USE doc FOR FURTHER WORK 
      saveXML(doc, file="/path/to/output.xml")
      

      我在 xml2 中找不到对应方法,因为它的 xml_add_child 需要字符串而不是节点。

      【讨论】:

      • 谢谢。这让我感到困惑,因为 xml_add_child 帮助表明 .value 是“要插入的节点或节点集”,但是当我尝试插入节点集时出现“错误:.value 必须是字符”。在这里讨论:github.com/r-lib/xml2/issues/170
      • 我认为您的意思是在上面接受的解决方案上提出这个问题,因为我使用的是 XML 包而不是 xml2
      • 抱歉,不够清晰。我同意你用 xml2 确定的问题。
      猜你喜欢
      • 2020-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-23
      • 2021-04-23
      • 2012-05-07
      相关资源
      最近更新 更多