在C#解码CDATA节(Decode CDATA section in C#)

2019-06-28 04:32发布

我有一点XML如下:

<section>
  <description>
    <![CDATA[
      This is a "description"
      that I have formatted
    ]]>
  </description>
</section>

我使用的是访问它curXmlNode.SelectSingleNode("description").InnerText ,但值返回

  \ r \ n这是一个“描述为” \ r \ n我已经格式化 
代替
  这是一个“说明”,我已经格式化。 

有一个简单的办法让那种输出的CDATA节? 离开实际CDATA标记出来,似乎有它原路返回。

Answer 1:

您可以使用LINQ阅读CDATA。

XDocument xdoc = XDocument.Load("YourXml.xml");
xDoc.DescendantNodes().OfType<XCData>().Count();

这是很容易得到的价值这种方式。

下面是MSDN上很好地概括: http://msdn.microsoft.com/en-us/library/bb308960.aspx

对于.NET 2.0中,你可能只需要通过正则表达式来传递:

     string xml = @"<section>
                      <description>
                        <![CDATA[
                          This is a ""description""
                          that I have formatted
                        ]]>
                      </description>
                    </section>";

        XPathDocument xDoc = new XPathDocument(new StringReader(xml.Trim()));
        XPathNavigator nav = xDoc.CreateNavigator();
        XPathNavigator descriptionNode = 
            nav.SelectSingleNode("/section/description");

        string desiredValue = 
            Regex.Replace(descriptionNode.Value
                                     .Replace(Environment.NewLine, String.Empty)
                                     .Trim(),
                @"\s+", " ");

该修剪你的节点值,用空代替换行,并取代1+空格用一个空格。 我不认为有任何其他的方式来做到这一点,考虑到CDATA正在返回显著空白。



Answer 2:

我认为最好的办法是...

XmlCDataSection cDataNode = (XmlCDataSection)(doc.SelectSingleNode("section/description").ChildNodes[0]);

string finalData = cDataNode.Data;


Answer 3:

其实我觉得是非常简单的。 该CDATA它会在被加载部XmlDocument像另一个XmlNode不同的是,这个节点将要具有这样的特性的NodeType = CDATA,至极意思,如果你有XmlNode node = doc.SelectSingleNode("section/description"); 该节点将有ChildNodeInnerText属性充满了纯粹的数据,并没有要删除的特殊字符只使用Trim()您将拥有的数据。

该代码将看起来像

XmlNode cDataNode = doc.SelectSingleNode("section/description").ChildNodes[0];
string finalData = cDataNode.InnerText.Trim();

谢谢
XOnDaRocks



Answer 4:

的更简单的形式@和Franky的解决方案 :

doc.SelectSingleNode("section/description").FirstChild.Value

Value属性等同于Data铸造的财产XmlCDataSection类型。



Answer 5:

CDATA块是有效一字不差。 里面CDATA任何空白是显著,根据定义,根据XML规范。 因此,当您检索节点值获取的空白。 如果你想用你自己的规则(因为XML规范没有指定CDATA剥离空白的任何标准方式)剥离它,你必须自己做,利用String.ReplaceRegex.Replace需要等。



文章来源: Decode CDATA section in C#