2017-04-18 113 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

相關問題