2017-10-11 14 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) 
} 

しかし、このdoesntの仕事...

任意のヘルプやヒントを感謝します!

ありがとうございます!

リンクされた画像には、現在のxmlファイルが表示されます。私が変更する必要がある値を黄色で強調表示します。

リンク:

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

+0

それはXML、現在および所望の結果を見るために役立つかもしれません。 – Parfait

答えて

1

XSLT、XMLファイルを変換するために設計された特別な目的の言語を考えてみましょう。 Rの木全体を書き換える必要はありません。パッケージ(CRAN-Rで利用可能)の拡張子xml2を使用すると、入力ソースを変換して出力を画面またはファイルに書き出すことができます。 XSLTの下に、あるとして文書をコピーするIdentity Transformを使用し

は、あなたの上記のコードの試みになく、第六属性を持つ似た<train>タグ内の属性の一つ、@sourceを書き換えます。

XMLrailIML 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> 

R

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

関連する問題