我有一点XML如下:
<section>
<description>
<![CDATA[
This is a "description"
that I have formatted
]]>
</description>
</section>
我使用的是访问它curXmlNode.SelectSingleNode("description").InnerText
,但值返回
\ r \ n这是一个“描述为” \ r \ n我已经格式化
代替
这是一个“说明”,我已经格式化。
有一个简单的办法让那种输出的CDATA节? 离开实际CDATA标记出来,似乎有它原路返回。
您可以使用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正在返回显著空白。
我认为最好的办法是...
XmlCDataSection cDataNode = (XmlCDataSection)(doc.SelectSingleNode("section/description").ChildNodes[0]);
string finalData = cDataNode.Data;
其实我觉得是非常简单的。 该CDATA
它会在被加载部XmlDocument
像另一个XmlNode
不同的是,这个节点将要具有这样的特性的NodeType = CDATA,至极意思,如果你有XmlNode node = doc.SelectSingleNode("section/description");
该节点将有ChildNode
用InnerText
属性充满了纯粹的数据,并没有要删除的特殊字符只使用Trim()
您将拥有的数据。
该代码将看起来像
XmlNode cDataNode = doc.SelectSingleNode("section/description").ChildNodes[0];
string finalData = cDataNode.InnerText.Trim();
谢谢
XOnDaRocks
的更简单的形式@和Franky的解决方案 :
doc.SelectSingleNode("section/description").FirstChild.Value
该Value
属性等同于Data
铸造的财产XmlCDataSection
类型。
CDATA块是有效一字不差。 里面CDATA任何空白是显著,根据定义,根据XML规范。 因此,当您检索节点值获取的空白。 如果你想用你自己的规则(因为XML规范没有指定CDATA剥离空白的任何标准方式)剥离它,你必须自己做,利用String.Replace
, Regex.Replace
需要等。