C# 在C中解码CDATA节#
我有一点XML,如下所示: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标记似乎会使其以相同的方式返回
<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
属性转换为castedxmlcatasection
类型的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