在R中,如何将两个XML文档合并到一个文档中?

时间:2017-04-18 01:00:10

标签: r xml

我正在查询基于XML的API中的数据。 API响应是分页的,因此我必须进行一系列查询才能获得完整的数据集。

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

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

所以,我很难过。

(注意:我在使用原始XML包发现如何执行此操作方面也没有取得任何成功。)

2 个答案:

答案 0 :(得分:0)

考虑使用XML包初始化带有<root>的空文档,并使用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需要一个字符串而不是节点。

答案 1 :(得分:0)

经过一些试验和错误后,我已经找到了如何使用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>