使用 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"
种属性。
我正在尝试使用 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"
种属性。