2017-10-11 62 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