首页 > 解决方案 > 如何在 R 中添加和重新排列 XML 文件的节点?

问题描述

下面是我拥有的 XML 文件的一个子集。我想在 下添加一个新元素,但无法使用它addNode()。如何在 下添加新节点<language>

另外,我如何重新排序文件以便<n_cases>紧接在前面<definite_source>

<?xml version="1.0" encoding="UTF-8"?>
<dataset>
  <language>
    <name>Old_Irish</name>
    <definite_source>Demonstrative</definite_source>
    <n_cases>5</n_cases>
  </language>
  <language>
    <name>Irish</name>
    <definite_source>Demonstrative</definite_source>
    <n_cases>4</n_cases>
  </language>
</dataset>

标签: rxmldatabasedataframe

解决方案


“xml2”包有一个简单的语法,用于在 XML 文档中添加和删除节点。

要重新排列结构,您首先需要找到并复制要移动的节点,然后将它们从文档中删除,然后将原始列表添加回文档中。除非您有非常具体的理由,否则我不会推荐这样做。

library(xml2)
library(magrittr)

page <- read_xml("<dataset>
  <language>
    <name>Old_Irish</name>
    <definite_source>Demonstrative1</definite_source>
    <n_cases>5</n_cases>
  </language>
  <language>
    <name>Irish</name>
    <definite_source>Demonstrative2</definite_source>
    <n_cases>4</n_cases>
  </language>
</dataset>")

#Find the nodes you want to relocate
nodesdefinite <- page %>% xml_find_all(".//definite_source")
html_structure(page)
#Remove the Nodes
page %>% xml_find_all(".//definite_source") %>% xml_remove()
#Add them where desired
page %>% xml_find_all(".//n_cases") %>% xml_add_sibling(nodesdefinite, .where="after")

#Verify the structure
html_structure(page)
page %>% xml_find_all(".//definite_source")

#To add a node
#Using the add_child, add the new node at the end of the list
page %>% xml_find_all(".//language") %>% xml_add_child("newNode", "new value")
html_structure(page)   #Verify the structure

#Using the add_sibling, better control for placement
page %>% xml_find_all(".//n_cases") %>% xml_add_sibling("newSibling", pi, .where="before")

推荐阅读