2

次のようなXMLNodeオブジェクトがある場合:

<foo>
 <a>1</a>
 <b>
  <c>1</c>
  <d>2</d>
 </b>
</foo>

(dputダンプとして利用可能:https ://gist.github.com/4273470 )

「c」ノードのネスト性を知らなくても、その値を「1」から「2」に変更するにはどうすればよいですか?私はXMLパッケージで遊んでいますが、それはそれほど明確ではありません。ほとんどの例は、情報を更新するのではなく、抽出することを扱っているようです。

私もを使ってみxmlToListましたが、任意の深さのリストでノードを識別/更新する方法もわかりません。

4

2 に答える 2

3

これが2段階の方法です。(testは、dput含めた出力です)。

への道を見つける$c

> xmlApply(test,names)
$a
  text 
"text" 

$b
  c   d 
"c" "d" 

$cパスがわかったら交換

xmlChildren(test[["b"]][["c"]]) <- "2"
于 2012-12-13T02:31:22.247 に答える
2

(おそらく、ほとんど)常にループと条件のブルートフォースの組み合わせを思い付くことができますが、これの正確な構造と複雑さはあなたの仮定に依存します。

たとえば、既知の最大深度が2(例のように親ノード=c("a", "b")と子ノード=c("c", "d")に加えて、候補のターゲット子ノードの既知のリスト(たとえば、「c」と「d」)であるが、親が不明であると仮定します。 -子の関係、あなたはこれを行うことができます:

replacement.list <- list(c = 2)

test.list <- xmlToList(test)
parent.names <- names(test.list)
for(replacement.name in names(replacement.list)){
  for(parent.name in parent.names){
    child.names <- names(test.list[[parent.name]])
    if(replacement.name %in% child.names){
      xmlChildren(test[[parent.name]][[replacement.name]]) <- replacement.list[[replacement.name]]
    }
  }
}

更新:再帰関数を使用したより洗練されたアプローチはここにあります:https ://stackoverflow.com/a/26154446/199217

于 2012-12-13T03:21:42.777 に答える