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」に置き換えられていることがわかります。
ただし、このコードを実現したい置換で試してみると( "&lt;"を "<"に置き換えてください)、明らかに機能しません。
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構文の一部であるため予約されていることを知っておく必要があります。そのため、これらの文字はノードのコンテンツに表示できません。したがって、これらの文字の一種のコーディングであるエンティティに置き換えられます。たとえば、「<」は「&lt;」としてコーディングされ、「&」は「&amp;」としてコーディングされます。
したがって、ここでは、ノードのコンテンツに「<」文字が含まれており、これは自動的に彼のエンティティ「&lt;」に変換されています。コードでやろうとしているのは、「&lt;」を置き換えることです。「<」で戻ってください。これはRが喜んで行いますが、これはノードのテキストコンテンツであるため、XMLパッケージはすぐに「&lt;」に変換し直します。
したがって、達成したいのが文字列「&lt; p&gt; ABC&lt; / p&gt;」を変換することである場合 新しいXMLノード「<p>ABC</ p>」に対しては、そのようにすることはできません。解決策は、テキスト文字列を解析し、そこからノード(ここでは「p」)の名前と名前を検出し、で新しいノードを作成しxmlNode()
、テキストコンテンツ「ABC」を指定して、文字列を自分だけのノードに置き換えることです。作成した。
これを行うもう1つの迅速で汚い方法は、最初に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>
しかし、これは危険です。なぜなら、「本物の」「&lt;」がある場合だからです。ファイル内のエンティティ、解析は失敗します。