2017-10-11 64 views
0

情况:将“软件”复制到R并返回到“软件”。 “软件”的唯一接口是xml。要列出并返回XML的XML

在R中,我需要对文件进行一些更改,以便将其转换为列表并进行一些更改。

library(XML) 
myFile = xmlParse("myXML") 
xml_data <- xmlToList(myFile) 
xml_data$timetable$train$.attrs[6] = "HelloNewWorld" 

现在我需要将此列表“xml_data”转换回xml。

我发现了一些功能,像这样:

function(item, tag) { 
    # just a textnode, or empty node with attributes 
    if(typeof(item) != 'list') { 
    if (length(item) > 1) { 
     xml <- xmlNode(tag) 
     for (name in names(item)) { 
     xmlAttrs(xml)[[name]] <- item[[name]] 
     } 
     return(xml) 
    } else { 
     return(xmlNode(tag, item)) 
    } 
    } 

    # create the node 
    if (identical(names(item), c("text", ".attrs"))) { 
    # special case a node with text and attributes 
    xml <- xmlNode(tag, item[['text']]) 
    } else { 
    # node with child nodes 
    xml <- xmlNode(tag) 
    for(i in 1:length(item)) { 
     if (names(item)[i] != ".attrs") { 
     xml <- append.xmlNode(xml, listToXml(item[[i]], names(item)[i])) 
     } 
    }  
    } 

    # add attributes to node 
    attrs <- item[['.attrs']] 
    for (name in names(attrs)) { 
    xmlAttrs(xml)[[name]] <- attrs[[name]] 
    } 
    return(xml) 
} 

但是,这并不工作...

任何帮助或暗示的赞赏!

谢谢!

在链接的图片中,您可以看到当前的xml文件。用黄色突出显示我需要更改的值。

链接:

https://i.stack.imgur.com/remzj.png

+0

它可能有助于看到XML,当前和预期的结果。 – Parfait

回答

1

考虑XSLT,设计来转换XML文件中的专用语言。无需在R中重写整个树。使用xslt包(可在CRAN-R上获得),扩展名为xml2,可以转换输入源并将输出写入屏幕或文件。

使用Identity Transform按原样复制文档,在XSLT下方,然后重写<train>标记中的一个属性,@source,类似于上面的代码尝试但具有第六个属性。

XML(从railIML Wiki page样品输入)

<?xml version="1.0" encoding="UTF-8"?> 

<railml xmlns:xsi="http://www.w3.org/2000/10/XMLSchema-instance" xsi:noNamespaceSchemaLocation="timetable.xsd"> 
    <timetable version="1.1"> 
     <train trainID="RX 100.2" type="planned" source="opentrack"> 
      <timetableentries> 
       <entry posID="ZU" departure="06:08:00" type="begin"/> 
       <entry posID="ZWI" departure="06:10:30" type="pass"/> 
       <entry posID="ZOER" arrival="06:16:00" departure="06:17:00" minStopTime="9" type="stop"/> 
       <entry posID="WS" departure="06:21:00" type="pass"/> 
       <entry posID="DUE" departure="06:23:00" type="pass"/> 
       <entry posID="SCW" departure="06:27:00" type="pass"/> 
       <entry posID="NAE" departure="06:29:00" type="pass"/> 
       <entry posID="UST" arrival="06:34:30" type="stop"/> 
      </timetableentries> 
     </train> 
    </timetable> 
</railml> 

XSLT(保存为文件的.xsl,重写@source属性)

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:template match="node()|@*"> 
     <xsl:copy> 
      <xsl:apply-templates select="node()|@*"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="@source"> 
     <xsl:attribute name="source">HelloNewWorld</xsl:attribute> 
    </xsl:template> 

</xsl:stylesheet> 

ř

library(xslt) 

doc <- read_xml("/path/to/Input.xml", package = "xslt") 
style <- read_xml("/path/to/XLSTScript.xsl", package = "xslt") 
new_xml <- xml_xslt(doc, style) 

# OUTPUT TO SCREEN 
cat(as.character(new_xml)) 

# OUTPUT TO FILE 
write_xml(new_xml, "/path/to/Output.xml") 

输出

<?xml version="1.0" encoding="UTF-8"?> 
<railml xmlns:xsi="http://www.w3.org/2000/10/XMLSchema-instance" xsi:noNamespaceSchemaLocation="timetable.xsd"> 
    <timetable version="1.1"> 
    <train trainID="RX 100.2" type="planned" source="HelloNewWorld"> 
     <timetableentries> 
     <entry posID="ZU" departure="06:08:00" type="begin"/> 
     <entry posID="ZWI" departure="06:10:30" type="pass"/> 
     <entry posID="ZOER" arrival="06:16:00" departure="06:17:00" minStopTime="9" type="stop"/> 
     <entry posID="WS" departure="06:21:00" type="pass"/> 
     <entry posID="DUE" departure="06:23:00" type="pass"/> 
     <entry posID="SCW" departure="06:27:00" type="pass"/> 
     <entry posID="NAE" departure="06:29:00" type="pass"/> 
     <entry posID="UST" arrival="06:34:30" type="stop"/> 
     </timetableentries> 
    </train> 
    </timetable> 
</railml> 
+0

非常感谢!你的回答绝对是真棒! – Severin

+0

太棒了!乐意效劳。我希望你尽可能喜欢XSLT。 – Parfait