2009-08-06 46 views
10

我有一点XML如下:解码CDATA节

<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标签看起来似乎以相同的方式返回。

回答

15

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

+0

谢谢,但我应该更具体一点,我在Compact Framework上做了2.0。我可能会考虑看看未来是否更有利于转移到3.5。 – Jess 2009-08-06 03:40:05

+0

我编辑了另一个想法。我没有安装.NET 2.0 CF,所以我不能100%确定它是兼容的。 – 2009-08-06 05:03:23

+0

工程很好。谢谢! – Jess 2009-08-06 22:09:11

3

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

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(); 

感谢
XOnDaRocks

8

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

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

string finalData = cDataNode.Data; 
+0

绝对是最好的解决方案,简而言之,没有字符串涉及的转换和使用System.Xml现有方法。 – lgrosales 2014-01-02 11:05:58

2

永邦的解决方案的一个简单的形式:

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

Value财产is equivalentData铸造XmlCDataSection类型的财产。