R:在特定位置将节点插入xml树 资料

R:在特定位置将节点插入xml树 资料,xml,r,search,insert,tree,Xml,R,Search,Insert,Tree,我有一个结构如下的xml文件(显示所需灵活性的大型示例): 目标 我的目标是将新创建的newNode作为具有特定值(例如“sth23”)的节点的子节点插入searchA属性。 因此,在本例中,我希望结果如下所示(注意底部附近的): 我不知道如何使用此信息将节点插入到树中的正确位置。 listOfNodes[indexVector]为我提供了正确的节点,但它现在是一个列表,而不是我可以使用的节点。addChildren()on. 即使我设法将所有节点的indexVector和xmlSize() 我

我有一个结构如下的xml文件(显示所需灵活性的大型示例):

目标 我的目标是将新创建的
newNode
作为具有特定值(例如
“sth23”
)的节点的子节点插入
searchA
属性。
因此,在本例中,我希望结果如下所示(注意底部附近的
):

我不知道如何使用此信息将节点插入到树中的正确位置。
listOfNodes[indexVector]
为我提供了正确的节点,但它现在是一个列表,而不是我可以使用的节点。
addChildren()
on.
即使我设法将所有节点的
indexVector
xmlSize()

我还尝试了
XML
包的其他几个功能,包括
xmlApply
getNodeLocation
getNodeSet
,但它们似乎没有帮助

我没有真正尝试过的 我不太理解
xmlTreeParse()
xmlInternalTreeParse()
xmlTreeParse(useInternalNodes=T)
之间的区别,而且我也无法理解XPath,所以我在尝试使用它时没有走多远


任何有用的提示都将不胜感激。

我之所以感到困惑,是因为
?xmlementsbytagname
的帮助页面。上面写着:

“添加递归参数使此函数的行为类似于其他语言API(如Java、C\#)中的getElementsByTagName。然而,我们应该小心地理解,在这些语言中,我们会得到一组节点对象。这些节点具有对其父节点和子节点的引用。因此,可以从每个节点导航树,查找其关系等。在当前版本的此包中(以及在可预见的将来),节点集是原始树中节点的“副本”。而且他们没有找到兄弟姐妹或父母的设施。”

这使我认为该函数返回的是副本列表,而不是对节点本身的引用。
如果解析xml时将
xmlTreeParse()
函数的标记
useInternalNodes
设置为
FALSE
,则可能会出现这种情况,但如果解析时将其设置为
TRUE
,则
xmlElementsByTagName()
返回的列表似乎包含实际引用。
例如,可以使用
addChildren()
轻松地对其进行操作

简而言之,我的问题的最简单解决方案是:

addChildren(listOfNodes[indexVector], kids = list(newNode))
xmlfile = xmlTreeParse(filename, useInternalNodes = TRUE)
xmltop = xmlRoot(xmlfile)
newNode = newXMLNode(name = "newlyCreatedNode")
<rootnode sth="something" descr="ex">
  <tag sth="sth1" descr="ex" anoAttr="sth2">
    <tag sth="sth3" descr="ex2" searchA="sth4" anoAttr="sth5">
      <tag sth="sth6" descr="ex3" oAttr="sth7" searchA="sth8" anoAttr="sth9">
        <tag sth="sth10" descr="ex4" oAttr="sth11" searchA="sth12" anoAttr="sth13">
          <someContent/>
        </tag>
        <someContent/>
      </tag>
      <tag sth="sth14" descr="ex5" oAttr="sth15" searchA="sth16" anoAttr="sth17">
        <someContent/>
      </tag>
      <tag sth="sth1" descr="ex6" oAttr="sth15" searchA="sth18" anoAttr="sth17">
        <someContent/>
      </tag>
    </tag>
    <tag sth="sth10" descr="ex2" oAttr="sth19" searchA="sth20" anoAttr="sth9">
      <someContent/>
    </tag>
    <tag sth="sth10" descr="ex7" searchA="sth21" anoAttr="sth13">
      <tag sth="sth21" descr="ex8" oAttr="sth22" searchA="sth23" anoAttr="sth9">
        <tag sth="sth23" descr="ex9" oAttr="sth22" searchA="sth24" anoAttr="sth5">
          <someContent/>
        </tag>
        <someContent/>
        <newlyCreatedNode/>
      </tag>
    </tag>
  </tag>
  <otherNode>
    <someNode/>
  </otherNode>
</rootnode>
listOfNodes = xmlElementsByTagName(el = xmltop, "tag", recursive = T)
attributeList = lapply(listOfNodes, FUN = function(x) xmlAttrs(x))
indexVector = sapply(attributeList, FUN = function(x) x["searchA"] == "sth23")
indexVector[is.na(indexVector)] = FALSE
listOfNodes[indexVector]
addChildren(listOfNodes[indexVector], kids = list(newNode))