如果您的问题是要知道如何替换 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 语法的一部分。因此,它们不能出现在节点的内容中,否则会解析会失败。所以它们被替换为实体,这是这些字符的一种编码。例如,“<”被编码为“<”,“&”被编码为“&”等。
所以这里,你节点的内容中包含了一个“<”字符,这个字符已经自动转换为他的实体“<”了。您尝试对代码执行的操作是替换“<” 返回“<”,R 很乐意为您做这件事,但由于它是节点的文本内容,XML 包会立即将其转换回“<”。
所以,如果你想要实现的是转换你的字符串 "<p>ABC </p>" 到一个新的 XML 节点“<p>ABC </p>”,你不能那样做。一种解决方案是解析您的文本字符串,从中检测节点的名称和(此处为“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>
但这很危险,因为如果有一个“真实的”“<” 文件中的实体,解析将失败。