在C#中解码CDATA部分

时间:2009-08-06 03:08:35

标签: c# .net xml xmldocument cdata

我有一点XML如下:

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

我正在使用curXmlNode.SelectSingleNode("description").InnerText访问它,但该值返回

\r\n      This is a "description"\r\n      that I have formatted
而不是
This is a "description" that I have formatted.

有没有一种简单的方法可以从CDATA部分获得那种输出?保留实际的CDATA标签似乎让它以同样的方式返回。

5 个答案:

答案 0 :(得分:17)

您可以使用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,您可能只需通过Regex传递它:

     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正在返回重要的空白,我认为没有其他办法可以做到这一点。

答案 1 :(得分:9)

其实我认为非常简单。 CDATA部分将XmlDocument部分加载到另一个XmlNode,不同之处在于此节点将具有NodeType = CDATA属性,如果您拥有{{1}则意味着XmlNode node = doc.SelectSingleNode("section/description"); 1}}该节点将ChildNode InnerText属性填充纯数据,并且您要删除特殊字符,只需使用Trim()即可获得数据。

代码看起来像

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

感谢
XOnDaRocks

答案 2 :(得分:9)

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

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

string finalData = cDataNode.Data;

答案 3 :(得分:4)

更简单的@Franky's solution形式:

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

Value属性is equivalentData类型的XmlCDataSection属性。

答案 4 :(得分:3)

CDATA块实际上是逐字的。根据XML规范,CDATA中的任何空格都很重要。因此,在检索节点值时会获得该空格。如果您想使用自己的规则剥离它(因为XML规范没有指定在CDATA中剥离空格的任何标准方法),您必须自己执行,根据需要使用String.ReplaceRegex.Replace