【问题标题】:Set all xml nodes as CDATA将所有 xml 节点设置为 CDATA
【发布时间】:2014-04-28 13:23:49
【问题描述】:

我有一个具有以下结构的 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 节点,有多个“字符串”节点。需要使所有节点CDATA。我所有的尝试都失败了,特别是因为来自“test2”的节点(更改 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>

【问题讨论】:

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

标签: c# xml cdata


【解决方案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");

【讨论】:

    【解决方案2】:
        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);
                }
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-28
      • 2020-06-02
      • 1970-01-01
      • 2014-11-04
      相关资源
      最近更新 更多