Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何读取XML输入文件、操作某些节点(删除和重命名某些节点)并将输出写入新的XML输出文件?_Xml_R - Fatal编程技术网

如何读取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,但这是

我需要从互联网上读取一个XML文件并对其进行重新格式化。 这是XML文件和到目前为止我所拥有的代码

library(XML)
url='http://ClinicalTrials.gov/show/NCT00001400?displayxml=true'  
doc = xmlParse(url,useInternalNode=TRUE)
我成功地使用了XML包中的一些函数(例如getNodeSet),但我不是专家,互联网上也有一些例子,但我自己无法解决这个问题。我也知道一些XPath,但这是4年前的事了,我不是sapply和类似函数的专家

但我的目标是:

  • 我需要删除一整套关于位置的XML子分支,例如:
    。。。任何东西
    。可以有多个具有位置数据的节点。我只是不需要输出中的细节。上面的XML文件始终符合XSD模式。根节点称为

  • 生成的简化文件应写入名为“data changed.XML”的新XML文件中

  • 我还需要重命名一个分支,并将其从

    
    纳入标准为xyz
    …

  • 在新输出(“data changed.xml”)中,结构应表示不同的xml节点,并直接位于根节点下:

    
    纳入标准为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"])