在C#中解码CDATA部分

Jes*_*ess 11 .net c# xml xmldocument cdata

我有一点XML如下:

<section>
  <description>
    <![CDATA[
      This is a "description"
      that I have formatted
    ]]>
  </description>
</section>
Run Code Online (Sandbox Code Playgroud)

我正在使用它,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标签似乎让它以同样的方式返回.

Jim*_*ert 18

您可以使用Linq读取CDATA.

XDocument xdoc = XDocument.Load("YourXml.xml");
xDoc.DescendantNodes().OfType<XCData>().Count();
Run Code Online (Sandbox Code Playgroud)

以这种方式获得价值非常容易.

以下是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+", " ");
Run Code Online (Sandbox Code Playgroud)

修剪节点值,用空替换换行符,用一个空格替换1+个空格.考虑到CDATA正在返回重要的空白,我认为没有任何其他方法可以做到这一点.


小智 9

其实我觉得很简单.该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();
Run Code Online (Sandbox Code Playgroud)

谢谢
XOnDaRocks


Fra*_*nky 9

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

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

string finalData = cDataNode.Data;
Run Code Online (Sandbox Code Playgroud)