我有一个具有以下结构的xml:
<rootNode>
<category name="test1">
<string name="n1">n1</string>
<string name="n2"><![CDATA[n2]]></string>
<string name="n3"><<n3</string>
</category>
<category name="test2">
<string name="n111">n111</string>
<string name="n2"><![CDATA[<<n2]]></string>
<string name="n3 &">
<![CDATA[n3
multiline]]>
</string>
</category>
rootNode
有多个category
个节点,有多个&#34;字符串&#34;节点。需要制作所有节点CDATA
。我的所有尝试都失败了,特别是因为来自&#34; test2&#34; (更改node.InnerText,使用string.Replace等解析文本。)
预期结果:
<rootNode>
<category name="test1">
<string name="n1"><![CDATA[n1]]></string>
<string name="n2"><![CDATA[n2]]></string>
<string name="n3"><![CDATA[<<n3]]></string>
</category>
<category name="test2">
<string name="n111"><![CDATA[n111]]></string>
<string name="n2"><![CDATA[<<n2]]></string>
<string name="n3 &">
<![CDATA[n3
multiline]]>
</string>
</category>
答案 0 :(得分:1)
您可以尝试这种方式:
var doc = new XmlDocument();
doc.Load("path_to_xml_file.xml");
var elements = doc.DocumentElement.SelectNodes("/rootNode/category/string");
foreach (XmlNode element in elements)
{
//check if content of <string> is not CData section
if(!(element.FirstChild is XmlCDataSection))
{
XmlCDataSection cdata = doc.CreateCDataSection(element.InnerText);
//replace inner text with CData section
element.ReplaceChild(cdata, element.FirstChild);
}
}
doc.Save("path_to_xml_file.xml");
答案 1 :(得分:0)
private void AddCData(string path) {
XmlDocument doc = new XmlDocument();
doc.Load(path);
XmlNode root = doc.DocumentElement;
foreach (XmlNode childNode in root.SelectNodes("/rootNode/category/string")) {
AddCData(childNode);
}
doc.Save(path + "_output.xml");
}
private void AddCData(XmlNode node) {
string innerText = node.InnerText;
if (!string.IsNullOrEmpty(innerText)) {
if (!innerText.StartsWith("<![CDATA[")) {
var newCDATA = node.OwnerDocument.CreateCDataSection(innerText);
node.InnerText = "";
node.AppendChild(newCDATA);
}
}
}