[英]Recursive function to flatten complex XML structure in R
我有很多項目需要R中的XML處理,而且我一直很努力。 問題總是相同的:將其他人的復雜XML結構解析為可行的數據框。
下面是我常見問題的示例。 對於我使用的數據,文件之間的節點名稱不一定是一致的,我通常只想將每個數據框行展平到最深的級別,然后用成人節點名稱或屬性填充列。
想要從中得到:
library(XML)
# Small example extract
# Most data points removed
xml_extract <- xmlParse("
<COMPARISON ID=\"CMP-001\" NO=\"1\">
<NAME>Incomplete resection (HGG)</NAME>
<DICH_SUBGROUP CHI2=\"0.0\" CI_END=\"0.0\" CI_START=\"0.0\">
<NAME>iMRI</NAME>
<DICH_DATA CI_END=\"0.9640231041199472\" CI_START=\"0.017586933339032232\"/>
</DICH_SUBGROUP>
<DICH_SUBGROUP CHI2=\"0.0\" CI_END=\"0.0\" CI_START=\"0.0\">
<NAME>5-ALA</NAME>
<DICH_DATA CI_END=\"0.7124078544369572\" CI_START=\"0.4242461206130219\"/>
</DICH_SUBGROUP>
<DICH_SUBGROUP CHI2=\"0.0\" CI_END=\"0.0\" CI_START=\"0.0\">
<NAME>DTI-neuronavigation</NAME>
<DICH_DATA CI_END=\"0.6302184844574396\" CI_START=\"0.19776580326143214\"/>
</DICH_SUBGROUP>
</COMPARISON>
")
對此:
(我知道其中兩列具有相同的NAME
,這是問題的一部分。不是我的XML)。
我使用XML
並看過XML2R
。 我對XPath
很熟悉。 標准xmlToDataFrame
類型的命令不起作用。 列表的xmlSApply
或plyr
等標准Apply
方法通常需要完全標准化的節點名稱。
我在尋找什么可能? 一個遞歸函數,用於遍歷和展平XML結構。 我知道我已經方便地省略了表中XML提取中不需要的部分:)預先謝謝!
編輯以提供更復雜和典型的示例。
非常感謝您對此提供的幫助,尤其是hrbmstr。 您的解決方案一直是我過去的方法。 我有8000個文檔,其中的示例有很大的變化,因此正在尋找一種解決方案,其中變量名稱由XML內容而不是函數定義。
復雜但典型的示例在這里:
library(httr)
library(XML)
url = "http://onlinelibrary.wiley.com/doi/10.1002/14651858.CD007635.pub2/downloadstats"
response = POST(url, body = list("tAndCs" = TRUE))
xml_record = content(response, "parsed", type="text/xml")
path = "//ANALYSES_AND_DATA"
xml_extract = xml_record[[path]]
它只需要系統地“攻擊” XML(不需要XSLT):
data.frame(comparison=xpathSApply(xml_extract, "//COMPARISON", xmlGetAttr, "ID"),
name=xpathSApply(xml_extract, "//COMPARISON/NAME", xmlValue),
dich_name=xpathSApply(xml_extract, "//COMPARISON/DICH_SUBGROUP/NAME", xmlValue),
ci_end=xpathSApply(xml_extract, "//COMPARISON/DICH_SUBGROUP/DICH_DATA", xmlGetAttr, "CI_END"),
ci_end=xpathSApply(xml_extract, "//COMPARISON/DICH_SUBGROUP/DICH_DATA", xmlGetAttr, "CI_START")
)
## comparison name dich_name ci_end ci_end.1
## 1 CMP-001 Incomplete resection (HGG) iMRI 0.9640231041199472 0.017586933339032232
## 2 CMP-001 Incomplete resection (HGG) 5-ALA 0.7124078544369572 0.4242461206130219
## 3 CMP-001 Incomplete resection (HGG) DTI-neuronavigation 0.6302184844574396 0.19776580326143214
如果這不能滿足您的需求,請發布一個更復雜的XML示例。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.