在C#中解码CDATA部分

我有一点XML如下:

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

  \ r \ n这是我已格式化的“描述”\ r \ n 

代替

 这是我格式化的“描述”。 

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

您可以使用Linq读取CDATA。

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

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

以下是MSDN的一个很好的概述: http : //msdn.microsoft.com/en-us/library/bb308960.aspx

对于.NET 2.0,您可能只需通过Regex传递它:

  string xml = @"
"; 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正在返回重要的空白,我认为没有任何其他方法可以做到这一点。

我认为最好的方法是……

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

其实我觉得很简单。 CDATA部分它将像另一个XmlNode一样加载到XmlDocument ,不同之处在于该节点将具有NodeType = CDATA属性,这意味着如果你有XmlNode node = doc.SelectSingleNode("section/description"); 该节点将具有填充纯数据的InnerText属性的ChildNode ,并且您想要删除特殊字符只需使用Trim() ,您将获得数据。

代码看起来像

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

谢谢
XOnDaRocks

一种更简单的@Franky解决方案 :

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

Value属性等效于已铸造的XmlCDataSection类型的Data属性。

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