【问题标题】:How to write CData in xml如何在 xml 中编写 CData
【发布时间】:2011-01-13 11:29:48
【问题描述】:

我有一个类似的 xml:

<?xml version="1.0" encoding="UTF-8"?>
<entry>
    <entry_id></entry_id>
    <entry_status></entry_status>
  </entry>

我正在其中写入数据:

XmlNode xnode = xdoc.SelectSingleNode("entry/entry_status");
xnode.InnerText = "<![CDATA[ " + Convert.ToString(sqlReader["story_status"]) + " ]]>" ;    

但它的 CDATA 将“

我知道我们可以像这样创建 CDATA:

XmlNode itemDescription = doc.CreateElement("description");
XmlCDataSection cdata = doc.CreateCDataSection("<P>hello world</P>");
itemDescription.AppendChild(cdata);
item.AppendChild(itemDescription);

但我的过程是读取 xml 的节点并更改其值而不是附加在其中。 谢谢

【问题讨论】:

    标签: c# xml


    【解决方案1】:

    如此处所述:msdn

    // Create an XmlCDataSection from your document
    var cdata = xdoc.CreateCDataSection(Convert.ToString(sqlReader["story_status"]));
    
    // Append the cdata section to your node
    xnode.AppendChild(cdata);
    

    【讨论】:

    • 我不想追加。我想改变它的价值..元素已经存在
    【解决方案2】:

    真的需要将它放在 CDATA 中,还是只想以不需要在代码中进行额外转义的方式将文本放入其中?

    InnerText 执行所需的任何转义,所以通常我会使用

    xnode.InnerText = Convert.ToString(sqlReader["story_status"]);
    

    ...但如果您真的想要CDATA node,您可以按照 Nekresh 的回答自己创建一个。

    【讨论】:

    • 太好了,这意味着我在 xml 中执行写入的方式。 excape 字符将自动处理,xml 阅读器不会遇到任何问题,我的 xml 不会损坏..对吗?
    • @Rajesh:没错。您可以看出设置 InnerText 属性会执行转义,因为这正是您当前的方法不起作用的原因 - 它正在为您转义文本“
    【解决方案3】:

    如果您确实需要 CDATA 部分(请参阅 Jon's answer),您可以这样实现:

    XmlNode xnode = xdoc.SelectSingleNode("entry/entry_status"); 
    XmlCDataSection cdata = xdoc.CreateCDataSection(Convert.ToString(sqlReader["story_status"]));
    xnode.InnerXml = cdata.OuterXml;
    

    这将替换xnode 的内容,而不是附加到它。

    【讨论】:

      【解决方案4】:

      使用 Node.InnerXml,而不是 Node.InnerText。 Node.InnerText 会自动替换特殊值。请注意,如果您在 InnerXml 中使用 CDATA 指定,则 Node.InnerText 是 CDATA 中的文本。 示例:

      public class Test
      {
          public static int Main(string[] args)
          {
              const string xmlTxt = @"<?xml version=""1.0"" encoding=""UTF-8""?>
      <entry>
          <entry_id></entry_id>
          <entry_status></entry_status>
        </entry>";
              TextReader treader = new StringReader(xmlTxt);
              XmlReader xreader = XmlReader.Create(treader);
              XmlDocument xdoc = new XmlDocument();
              xdoc.Load(xreader);
      
              XmlNode xnode = xdoc.SelectSingleNode("entry/entry_status");
              //xnode.InnerText = "<![CDATA[something]]>";
              xnode.InnerXml = "<![CDATA[something]]>";
              Console.WriteLine("inner text is: " + xnode.InnerText);
      
              xdoc.Save(Console.Out); Console.WriteLine();
      
              return 0;
          }
      }
      

      程序的输出:

      内部文字是:某事

      【讨论】:

        【解决方案5】:
        XmlNode childNode = node.ChildNodes[0];
        if (childNode is XmlCDataSection)
        {
            XmlCDataSection cdataSection = childNode as XmlCDataSection;
            cdataSection.Value = newValue;
        }
        

        【讨论】:

          【解决方案6】:

          您可以使用writer.WriteCData(value);

          作者是XmlWriter 对象。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-03-21
            • 2010-11-01
            • 1970-01-01
            • 2011-09-09
            相关资源
            最近更新 更多