我需要从互联网上读取一个XML文件并重新塑造它。 这是我迄今为止的XML文件和代码。
library(XML)
url='http://ClinicalTrials.gov/show/NCT00001400?displayxml=true'
doc = xmlParse(url,useInternalNode=TRUE)
我能够使用XML包中的某些函数(例如,getNodeSet),但我不是专家,互联网上有一些例子,但我自己无法解决这个问题。我也知道一些XPath,但这是4年前的事情,我不是一个关于sapply和类似功能的专家。
但我的目标是:
我需要删除一组关于位置的XML子分支,例如:<location> ... anything </location>
。可以有多个具有位置数据的节点。我根本不需要输出中的细节。上面的XML文件始终符合XSD架构。根节点称为<clinical_study>
。
生成的简化文件应写入名为“data-changed.xml”的新XML文件中。
我还需要重命名并从
的旧嵌套位置移动一个分支 <eligibility>
<criteria>
<textblock>
Inclusion criteria are xyz
</textblock/>...
在新输出(“data-changed.xml”)中,结构应该说不同的XML节点并且直接位于根节点下:
<eligibility_criteria>
Inclusion criteria are xyz
</eligibility_criteria>
所以我需要:
非常感谢任何想法?
另外,如果你知道一个很好的(最近的!)关于R中的XML解析的教程(或者解决它的书籍章节,请分享参考)。 (我读过Duncan的小插曲,这些太过于先进(太简洁))。
答案 0 :(得分:5)
删除所有位置节点的代码:
r <- xmlRoot(doc)
removeNodes(r[names(r) == "location"])
答案 1 :(得分: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)
希望这会有所帮助。
答案 2 :(得分: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>
这当然是一种风格 - 您没有足够精确地指定转换规则以转换为准确的代码。