11

我有一些 XML 如下:

<section>
  <description>
    <![CDATA[
      This is a "description"
      that I have formatted
    ]]>
  </description>
</section>

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

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

有没有一种简单的方法可以从 CDATA 部分获取这种输出?留下实际的 CDATA 标记似乎让它以相同的方式返回。

4

5 回答 5

18

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

于 2009-08-06T03:16:48.617 回答
11

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

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

string finalData = cDataNode.Data;
于 2011-08-30T09:15:44.757 回答
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

于 2010-05-07T15:28:21.880 回答
4

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

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

Value属性等效Data强制XmlCDataSection类型转换的属性。

于 2017-01-11T14:35:23.787 回答
3

CDATA 块实际上是逐字记录的。根据 XML 规范的定义,CDATA 中的任何空格都很重要。因此,当您检索节点值时,您会得到该空格。如果您想使用自己的规则来剥离它(因为 XML 规范没有指定在 CDATA 中剥离空白的任何标准方式),您必须自己完成,根据需要使用String.ReplaceRegex.Replace

于 2009-08-06T05:06:21.587 回答