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

这是一个两步法。(testdput您包含的输出)。

找到通往的路径$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”),但未知父节点-child 关系,你可以这样做:

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 回答