我正在查询基于XML的API中的数据。 API响应是分页的,因此我必须进行一系列查询才能获得完整的数据集。
使用read_xml
包中的xml2
,我可以轻松地发出每个请求并将其保存为XML文档,但我一直无法弄清楚如何使用库将它们组合到一起一份文件。 (我想这样做,所以我可以进行一次Xpath查询,而不是50次。)
我尝试创建一个新的空白文档并将其他节点添加为元素,但xml_add_child
和xml_add_sibling
函数将第二个文档作为参数,似乎都不喜欢正在传递xml_find_all
查询的结果。 (他们抱怨无法使用参考文献。)
所以,我很难过。
(注意:我在使用原始XML
包发现如何执行此操作方面也没有取得任何成功。)
答案 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>