使用 xml_replace 会留下一些格式

Using xml_replace leaves behind some formatting

我正在尝试使用 R 中的 xml2 库将 XML 文档的某些节点替换为文本。在下面的示例中,我试图将所有“名称”节点转换为文本,但最终结果仍然在文本周围有“<”和“/>”。

library(xml2)
x <- read_xml(
  "<scenario>
  <event>
  <dataProbeEvent>
  <name>LogSurvResHigh</name>
  </dataProbeEvent>
  </event>
  <event>
  <accumulateEvent>
  <name>SetSurvOut</name>
  </accumulateEvent>
  </event>
  </scenario>")
x
> {xml_document}
<scenario>
[1] <event>\n  <dataProbeEvent>\n    <name>LogSurvResHigh</name>\n  </dataProbeEvent>\n ...
[2] <event>\n  <accumulateEvent>\n    <name>SetSurvOut</name>\n  </accumulateEvent>\n</ ...
namerefs <- xml_find_all(x, './/name')
replacements = namerefs %>%xml_text()
xml_replace(namerefs, replacements)
> {xml_document}
<scenario>
[1] <event>\n  <dataProbeEvent>\n    <LogSurvResHigh/>\n  </dataProbeEvent>\n</event>
[2] <event>\n  <accumulateEvent>\n    <SetSurvOut/>\n  </accumulateEvent>\n</event>

我希望它看起来像:

> {xml_document}
<scenario>
[1] <event>\n  <dataProbeEvent>\n    LogSurvResHigh\n  </dataProbeEvent>\n</event>
[2] <event>\n  <accumulateEvent>\n    SetSurvOut\n  </accumulateEvent>\n</event>

XML 文档是一种嵌套数据类型,很像 R 中的列表。如果你修剪一个节点,那么该节点中的所有信息都会丢失。我发现通常更容易将其转换为平面数据类型(如字符向量),然后删除不需要的信息。然后可以根据需要将其转换回 XML。

另一种方法是使用 XML 定位所需的父节点,然后使用 xml_text 提取文本。但我相信这会删除所有换行符。

x_char <- as.character(x)
x_noname <- gsub("<name>|<\/name>","",x_char)
x_noname

x_noname <- read_xml(x_noname)
x_noname
# {xml_document}
# <scenario>
#   [1] <event>\n  <dataProbeEvent>\n      LogSurvResHigh\n    </dataProbeEvent>\n</event>
#   [2] <event>\n  <accumulateEvent>\n      SetSurvOut\n    </accumulateEvent>\n</event>

您应该使用以下内容:-

x <- as.character(x)
x_sub <- gsub("<name[^>]*>|<\/name>","",x)
x <- read_xml(x_sub)
x

{xml_document}
<scenario>
[1] <event>\n  <dataProbeEvent>\n      LogSurvResHigh\n  </dataProbeEvent>\n</event>
[2] <event>\n  <accumulateEvent>\n      SetSurvOut\n    </accumulateEvent>\n</event>

这将从 name 节点中删除 ref-type="bibr" rid="CR8" 种属性。