2012-01-04 114 views
3

我需要從互聯網上讀取一個XML文件並重新塑造它。 這是XML文件和我到目前爲止的代碼。如何讀取XML輸入文件,操作某些節點(刪除並重命名某些文件)並將輸出寫入新的XML輸出文件?

library(XML) 
url='http://ClinicalTrials.gov/show/NCT00001400?displayxml=true' 
doc = xmlParse(url,useInternalNode=TRUE) 

我能夠在XML封裝中使用某些功能sucess(例如,getNodeSet),但我不是專家,也有在互聯網上的一些例子,但我沒能破解這個問題我自己。我也知道一些XPath,但這是4年前的事情,我不是熟練使用Sapply和類似功能的專家。

但我的目標是:

  1. 我需要刪除了一整套關於位置XML孩子分支機構。

    <location> ... anything </location>

可存在與位置數據的多個節點。我只是不需要輸出中的細節。

上面的XML文件始終符合XSD架構。根節點是。

2. 所得簡化文件應該被寫入一個新的XML文件名爲數據changed.xml

3. 我還需要重命名和老嵌套的地方

<eligibility> 
    <criteria> 
     <textblock> 
      Inclusion criteria are xyz 
    </textblock/>... 
移動一個分支

在新的輸出(data-changed.xml)中,結構應該表示不同的XML節點並且直接位於根節點下。

入選標準是XYZ

所以我需要 - 讀取XML到內存 - 操作樹(修剪它的地方) - 移動某些XML節點到一個新的地方,並以新名稱和 - 編寫生成的XML輸出文件。

任何想法非常感激?另外,如果你知道關於R中XML解析的一個很好的(最近的!)教程(或者解決它的書籍章節,請分享參考資料)。 (我讀過鄧肯的小插曲,這些插圖太過先進(太簡明))。

回答

4

代碼刪除所有位置的節點:

r <- xmlRoot(doc) 
removeNodes(r[names(r) == "location"]) 
2

這是XSLT的設計目的。這是一種學習曲線,但一旦掌握,它是迄今爲止做這類工作最有效的方式。您可以把您的英語直接規則轉換爲XSLT規則:例如,你的第一個規定說,去除所有位置元素和他們的孩子很簡單:

<xsl:template match="location"/> 

和有關移動內容成爲新的根節點下的規則可能是:

<xsl:template match="/"> 
    <new-root-node> 
    <xsl:copy-of select="//eligibility/criteria"/> 
    <xsl:apply-templates/> 
    </new-root-node> 
</xsl:template> 

這當然只是一個味道 - 你還沒有足夠精確地指定你的轉換規則來轉換成精確的代碼。

+0

確定。我過去寫過一些XSLT。但它並沒有完全解決我的問題。我搜索了R的原生XSLT庫,但無法找到它。只有通過系統命令我可能會調用一些外部XSLT分析器。它仍然需要很多我無法編寫的R代碼。 你知道如何在R中實現這樣的事情: outputXML < - 過程(XMLfile,withTHISxsltFile) – userJT 2012-01-05 22:34:34

4

有關如何將xpath應用於xml文件的問題的快速回答是使用xpathSApply。這適用於我:

library(XML) 
nct_url <- "http://clinicaltrials.gov/ct2/show/NCT00112281?resultsxml=true" 
xml_doc <- xmlParse(nct_url, useInternalNode=TRUE) 
elig_path <- "/clinical_study/eligibility/criteria/textblock" 
elig_text <- xpathSApply(xml_doc, elig_path, xmlValue) 

我正在使用R及其XML包使用clinicaltrials.gov XML文件做一些工作。這個軟件包很棘手,我只是部分理解它。我寫了一個函數來幫助處理在XML缺少的節點:

findbyxpath <- function(xmlfile, xpath) { 
    xmldoc <- xmlParse(xmlfile) 
    result <- try(xpathSApply(xmldoc, xpath, xmlValue)) 
    if(length(result) == 0) { # check for empty list, returned if node not found 
    return("") 
    } else { 
    return(result) 
    } 
} 

我從提前clinicaltrials.gov下載的文件使用XML,所以file就是其中的一個。然後我的例子會看起來像這樣:

file <- "NCT00112281.xml" 
elig_text <- findbyxpath(file, elig_path) 

希望這會有所幫助。

+0

我完全同意XML包是棘手的! – userJT 2013-12-17 17:20:13

相關問題