【问题标题】:update a node (of unknown depth) using xpath in R?在 R 中使用 xpath 更新节点(未知深度)?
【发布时间】:2012-12-13 02:15:42
【问题描述】:

如果我有一个如下所示的 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,但我也不知道如何识别/更新任意深度列表中的节点。

【问题讨论】:

标签: r xpath


【解决方案1】:

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

找到$c的路径

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

$b
  c   d 
"c" "d" 

知道路径后替换$c

xmlChildren(test[["b"]][["c"]]) <- "2"

【讨论】:

  • 谢谢...关于如何自动解析xmlApply(test, names) 的输出以供第二步使用的任何想法? (比从do.call(paste("xmlChildren(test[['",... 开始更容易)
【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多