如果您的问题是要知道如何替换 XML 节点内容中的字符串,那么您可以使用您提供的 sample.xml 文件检查以下代码:
## Parse the XML file
doc <- xmlTreeParse("sample.xml", useInternal = TRUE)
## Select the nodes we want to update
nodes <- getNodeSet(doc, "//Text")
## For each node, apply gsub on the content of the node
lapply(nodes, function(n) {
xmlValue(n) <- gsub("ABC","foobar",xmlValue(n))
})
这会给你:
R> doc
<?xml version="1.0"?>
<Text>
<p>foobar </p>
</Text>
在这里你可以看到“ABC”被“foobar”取代了。
但是,如果您尝试使用您想要实现的替代代码(将“<”替换为“
doc <- xmlTreeParse("sample.xml", useInternal = TRUE)
nodes <- getNodeSet(doc, "//Text")
lapply(nodes, function(n) {
xmlValue(n) <- gsub("<","<",xmlValue(n))
})
会给你:
R> doc
<?xml version="1.0"?>
<Text>
<p>ABC </p>
</Text>
为什么?如果您正在使用 XML 文件,您应该知道某些字符,主要是 、& 和 " 是保留的,因为它们是基本 XML 语法的一部分。因此,它们不能出现在节点的内容中,否则会解析会失败。所以它们被替换为entities,这是对这些字符的一种编码。例如,“
所以这里,你节点的内容中包含了一个“
所以,如果你想要实现的是转换你的字符串 "<p>ABC </p>"到一个新的 XML 节点“
ABC
”,你不能那样做。一个解决方案是解析您的文本字符串,从中检测节点的名称和(此处为“p”),使用
xmlNode() 创建一个新节点,为其提供文本内容“ABC”并将字符串替换为刚刚创建的节点。
另一种快速而肮脏的方法是首先替换文件中的所有实体而不解析 XML。像这样:
txt <- readLines(file("sample.xml"))
txt <- gsub("<", "<", txt)
txt <- gsub(">", ">", txt)
writeLines(txt, file("sample2.xml"))
doc2 <- xmlTreeParse("sample2.xml", useInternal = TRUE)
这给出了:
R> doc2
<?xml version="1.0"?>
<Text>
<p>ABC </p>
</Text>
但是这是危险的,因为如果有一个“真实的”“<”文件中的实体,解析将失败。