将所有xml节点设置为CDATA

时间:2014-04-28 13:23:50

标签: c# xml cdata

我有一个具有以下结构的xml:

<rootNode>
<category name="test1">
    <string name="n1">n1</string>
    <string name="n2"><![CDATA[n2]]></string>
    <string name="n3">&lt;&lt;n3</string>
</category>
<category name="test2">
    <string name="n111">n111</string>
    <string name="n2"><![CDATA[&lt;&lt;n2]]></string>
    <string name="n3 &amp;">
        <![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[&lt;&lt;n2]]></string>
    <string name="n3 &amp;">
        <![CDATA[n3
        multiline]]>
    </string>
</category>

2 个答案:

答案 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);
            }
        }
    }