簡體   English   中英

遞歸函數以扁平化R中的復雜XML結構

[英]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類型的命令不起作用。 列表的xmlSApplyplyr等標准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]]

我沒有使用過XSLTR接口 也沒有XSLT。

它只需要系統地“攻擊” 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM