2012-01-04 113 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

相关问题