2017-08-28 7 views
0

xml2を使ってxmlファイルを新しいノードで更新しようとしています。それは私がちょうどテキストとして手動ですべてを書いた場合、簡単だxml2パッケージを使用してdataframeをxmlに変換するにはどうすればよいですか?

oldXML <- read_xml("<Root><Trial><Number>3.14159 </Number><Adjective>Fast </Adjective></Trial></Root>") 

が、私は計算を実行し、XMLにそれらの値を置くアプリケーションを開発していますので、私は、文字や変数の組み合わせを必要とします。これは、ように見える終わる:私はpaste0を使用するよりもこれを行うにははるかに少ない場しのぎの方法があります疑う

var1 <- 4.567 
var2 <- "Slow" 
newLine <- read_xml(paste0("<Trial><Number>",var1," </Number><Adjective>",var2," </Adjective></Trial>")) 
xml_add_child(oldXML,newLine) 

が、私は仕事に何かを得ることができません。私はちょうどそれが新しいトライアルを作成することができるように、データフレームを参照することによって、XMLを更新することを指示できるようにしたいと思います:

<Trial> 
    <Number>df$number[1]</Number> 
    <Adjective>df$adjective[1]</Adjective> 
</Trial> 
<Trial> 
    <Number>df$number[2]</Number> 
    <Adjective>df$adjective[2]</Adjective> 
</Trial> 

は約そのやり方で新しい試用ノードを作成する方法はあります、またはpaste0を使って変数を挿入するよりも少なくとも自然にですか?これはXMLパッケージがxml2より優れているのでしょうか?

+0

'rio :: export(dat、" dat.xml ")'を試して、あなたに満足しているXMLファイルがあるかどうか確認してください。 – Thomas

+0

エラー:オブジェクト 'read_xls'が 'namespace:readxl'によってエクスポートされていません – RichardMNIxon

答えて

1

あなたは、このようなdata.frameに新しい値がある場合:

vars <- data.frame(Number = c(4.567, 3.211), 
        Adjective = c("Slow", "Slow"), 
        stringsAsFactors = FALSE) 

を次のようにxml_document年代のリストに変換することができます:

vars_xml <- lapply(purrr::transpose(vars), 
        function(x) { 
         as_xml_document(list(Trial = lapply(x, as.list))) 
        }) 

次にあなたが追加することができます元のxmlへの新しいノード:

私はこれがあなたより優れているかどうかわかりませんpasteアプローチ。いずれにしても、関数でラップすることができますので、醜いコードを一度書くだけで済みます。

+0

ありがとうございます。ノードあたり2つ以上の値があります。 – RichardMNIxon

関連する問題