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