C# 将所有xml节点设置为CDATA

C# 将所有xml节点设置为CDATA,c#,xml,cdata,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&g

我有一个具有以下结构的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>

private void AddCData(字符串路径){
XmlDocument doc=新的XmlDocument();
单据加载(路径);
XmlNode root=doc.DocumentElement;
foreach(根目录中的XmlNode-childNode.SelectNodes(“/rootNode/category/string”)){
AddCData(childNode);
}
保存文档(路径+“_output.xml”);
}
私有void AddCData(XmlNode节点){
字符串innerText=node.innerText;
如果(!string.IsNullOrEmpty(innerText)){
如果(!innerText.StartsWith(“),您可以尝试以下方法:

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");
var doc=new XmlDocument();
Load(“path_to_xml_file.xml”);
var elements=doc.DocumentElement.SelectNodes(“/rootNode/category/string”);
foreach(元素中的XmlNode元素)
{
//检查的内容是否不是CData节
如果(!(element.FirstChild是XMLCDATA节))
{
XMLCDATA节cdata=doc.createCDATA节(element.InnerText);
//用CData节替换内部文本
element.ReplaceChild(cdata,element.FirstChild);
}
}
doc.Save(“path_to_xml_file.xml”);

您尝试了什么?您使用的解析器是什么?在尝试更改InnerText时,我使用了XmlDocument(问题是输出xml有![CDATA[n1]])。还尝试了System.IO.File.ReadAllText+String.Replace(问题是多行CDATA),“在需要保持不变的现有CDATA中,”&;“在需要保持不变的属性名称中)如果您有更多信息,请编辑您的问题。包括您迄今为止使用的代码。经过进一步挖掘,我通过清除InnerText并添加一个新的CData部分解决了这个问题。用答案回答下面的问题。无论如何,谢谢,gunr2171!这是一个很好的例子,说明了为什么您不应该在不注意X的情况下尝试在XML上执行任意搜索替换ML规格和内容。
    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);
            }
        }
    }
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");