2017-04-18 123 views
0

我从基于XML的API查询数据。 API响应是分页的,所以我必须进行一堆查询才能获得完整的数据集。在R中,如何将两个XML文档合并到一个文档中?

使用xml2包中的read_xml,我可以轻松地将每个请求保存为XML文档,但我一直无法确定如何使用该库将它们合并为一个文档。 (我想这样做,所以我可以使Xpath查询我需要做一次,而不是50次)。

我试过创建一个新的空白文档并添加其他元素的节点作为元素,但xml_add_childxml_add_sibling函数也不会将第二个文档作为参数,并且似乎也不喜欢通过xml_find_all查询的结果。 (他们抱怨没有能力参考文献。)

所以,我很难过。

(注:我还没有在探索如何与原来XML包做任何成功)

回答

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> 
0

考虑XML封装<root>初始化一个空文件并反复使用追加其他XML内容addChildren()方法从每个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需要的字符串不节点(一个或多个)。

+0

谢谢。这让我感到困惑,因为xml_add_child帮助表明.value是一个“要插入的节点或节点集”,但当我尝试插入节点集时,出现“Error:'.value' must be a character”。在这里讨论:https://github.com/r-lib/xml2/issues/170 – jtr13

+0

我想你应该问这个上面接受的解决方案,因为我使用'XML'包而不是'xml2'。 – Parfait

+0

对不起,不清楚。我同意你用xml2标识的问题。 – jtr13

相关问题