我有一点XML如下:
<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标签似乎让它以同样的方式返回。
答案 0 :(得分:17)
您可以使用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,您可能只需通过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+", " ");
修剪节点值,用空替换换行符,并用一个空格替换1+个空格。考虑到CDATA正在返回重要的空白,我认为没有其他办法可以做到这一点。
答案 1 :(得分:9)
其实我认为非常简单。 CDATA
部分将XmlDocument
部分加载到另一个XmlNode
,不同之处在于此节点将具有NodeType = CDATA属性,如果您拥有{{1}则意味着XmlNode node = doc.SelectSingleNode("section/description");
1}}该节点将ChildNode
InnerText
属性填充纯数据,并且您要删除特殊字符,只需使用Trim()
即可获得数据。
代码看起来像
XmlNode cDataNode = doc.SelectSingleNode("section/description").ChildNodes[0];
string finalData = cDataNode.InnerText.Trim();
感谢
XOnDaRocks
答案 2 :(得分:9)
我认为最好的方法是......
XmlCDataSection cDataNode = (XmlCDataSection)(doc.SelectSingleNode("section/description").ChildNodes[0]);
string finalData = cDataNode.Data;
答案 3 :(得分:4)
更简单的@Franky's solution形式:
doc.SelectSingleNode("section/description").FirstChild.Value
Value
属性is equivalent到Data
类型的XmlCDataSection
属性。
答案 4 :(得分:3)
CDATA块实际上是逐字的。根据XML规范,CDATA中的任何空格都很重要。因此,在检索节点值时会获得该空格。如果您想使用自己的规则剥离它(因为XML规范没有指定在CDATA中剥离空格的任何标准方法),您必须自己执行,根据需要使用String.Replace
,Regex.Replace
等