C# 在C中解码CDATA节#

C# 在C中解码CDATA节#,c#,.net,xml,xmldocument,cdata,C#,.net,Xml,Xmldocument,Cdata,我有一点XML,如下所示: <section> <description> <![CDATA[ This is a "description" that I have formatted ]]> </description> </section> 而不是这是一个“描述”,我已经格式化 有没有一种简单的方法可以从CDATA部分获得这种输出?保留实际的CDATA标记似乎会使其以相同的方式返回

我有一点XML,如下所示:

<section>
  <description>
    <![CDATA[
      This is a "description"
      that I have formatted
    ]]>
  </description>
</section>
而不是这是一个“描述”,我已经格式化


有没有一种简单的方法可以从CDATA部分获得这种输出?保留实际的CDATA标记似乎会使其以相同的方式返回。

您可以使用Linq读取CDATA

XDocument xdoc = XDocument.Load("YourXml.xml");
xDoc.DescendantNodes().OfType<XCData>().Count();
XDocument xdoc=XDocument.Load(“YourXml.xml”);
xDoc.degenantNodes().OfType().Count();
这样很容易得到值

下面是MSDN的一个很好的概述:

对于.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+", " ");
stringxml=@”
";
XPathDocument xDoc=新的XPathDocument(新的StringReader(xml.Trim());
XPathNavigator nav=xDoc.CreateNavigator();
XPathNavigator描述节点=
导航选择单节点(“/section/description”);
字符串desiredValue=
Regex.Replace(descriptionNode.Value
.Replace(Environment.NewLine,String.Empty)
.Trim(),
@“\s+”,“”);

这将修剪节点值,将换行替换为空,并将1+空格替换为一个空格。考虑到CDATA返回大量空白,我认为没有其他方法可以做到这一点。

CDATA块实际上是逐字逐句的。根据XML规范的定义,CDATA中的任何空格都是重要的。因此,当您检索节点值时,就会得到该空格。如果你想用你自己的规则去除它(因为XML规范没有指定任何标准的方法去除CDATA中的空白),你必须自己去做,根据需要使用
String.Replace
Regex.Replace
等等。

实际上我认为这非常简单。与另一个
XmlNode
节点一样,
CDATA
部分将加载到
XmlDocument
中。区别在于此节点将具有属性NodeType=CDATA,这意味着如果您具有
XmlNode节点=doc。选择SingleNode(“部分/描述”)
该节点将有一个
ChildNode
,其中
InnerText
属性填充纯数据,如果您想删除特殊字符,只需使用
Trim()
即可获得数据

代码如下所示

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

我认为最好的办法是

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

string finalData = cDataNode.Data;
一种更简单的形式:


Value
属性转换为casted
xmlcatasection
类型的
Data
属性。

谢谢,但我应该更具体地说,我是在2.0的Compact框架上这样做的。不过,我可能会研究一下,在未来迁移到3.5是否更有利。但是我没有安装.NET 2.0 CF,所以我不能100%确定它是否兼容。@吉姆·舒伯特,你的意思是在“后代节点”后面加括号,例如:“xDoc.后代节点().OfType().Count();”?@Anthony:当然可以,先生!谢谢你指出这一点。我已经用更正更新了答案!绝对是最好的解决方案,简短,不涉及字符串转换,并且使用System.Xml现有方法;
XmlNode cDataNode = doc.SelectSingleNode("section/description").ChildNodes[0];
string finalData = cDataNode.InnerText.Trim();
XmlCDataSection cDataNode = (XmlCDataSection)(doc.SelectSingleNode("section/description").ChildNodes[0]);

string finalData = cDataNode.Data;
doc.SelectSingleNode("section/description").FirstChild.Value