如何读取XML输入文件、操作某些节点(删除和重命名某些节点)并将输出写入新的XML输出文件?
我需要从互联网上读取一个XML文件并对其进行重新格式化。 这是XML文件和到目前为止我所拥有的代码如何读取XML输入文件、操作某些节点(删除和重命名某些节点)并将输出写入新的XML输出文件?,xml,r,Xml,R,我需要从互联网上读取一个XML文件并对其进行重新格式化。 这是XML文件和到目前为止我所拥有的代码 library(XML) url='http://ClinicalTrials.gov/show/NCT00001400?displayxml=true' doc = xmlParse(url,useInternalNode=TRUE) 我成功地使用了XML包中的一些函数(例如getNodeSet),但我不是专家,互联网上也有一些例子,但我自己无法解决这个问题。我也知道一些XPath,但这是
library(XML)
url='http://ClinicalTrials.gov/show/NCT00001400?displayxml=true'
doc = xmlParse(url,useInternalNode=TRUE)
我成功地使用了XML包中的一些函数(例如getNodeSet),但我不是专家,互联网上也有一些例子,但我自己无法解决这个问题。我也知道一些XPath,但这是4年前的事了,我不是sapply和类似函数的专家
但我的目标是:
。。。任何东西
。可以有多个具有位置数据的节点。我只是不需要输出中的细节。上面的XML文件始终符合XSD模式。根节点称为
纳入标准为xyz
…
纳入标准为xyz
- 将XML读入内存
- 操纵树(在某处修剪)
- 将一些XML节点移动到新位置并使用新名称和
- 编写生成的XML输出文件李>
另外,如果您知道R中关于XML解析的一个很好的(最近的!)教程(或者书中讨论这个问题的章节,请分享参考资料)。(我读了邓肯的小插曲,这些太高级了(太简洁了)) 这就是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>
当然,这只是一种味道——您没有足够精确地指定转换规则,无法将其转换为准确的代码。对于如何将xpath应用于xml文件的问题,快速回答是使用
xpathsaply
。这对我很有用:
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 <- xmlRoot(doc)
removeNodes(r[names(r) == "location"])
r正常。我以前写过一些XSLT。但这并不能完全解决我的问题。我在谷歌上搜索了R的原生XSLT库,但没有找到。只有通过系统命令,我才能调用一些外部XSLT解析器。它仍然需要很多我无法编写的R代码。您知道如何在R中实现这样的功能:outputXML吗
file <- "NCT00112281.xml"
elig_text <- findbyxpath(file, elig_path)
r <- xmlRoot(doc)
removeNodes(r[names(r) == "location"])