代码之家  ›  专栏  ›  技术社区  ›  Jess

解码c中的cdata部分#

  •  10
  • Jess  · 技术社区  · 15 年前

    我有一点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标记似乎让它以同样的方式返回。

    5 回复  |  直到 6 年前
        1
  •  16
  •   Joseph Yaduvanshi    13 年前

    您可以使用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返回了大量空白。

        2
  •  9
  •   Franky    13 年前

    我想最好的办法是…

    XmlCDataSection cDataNode = (XmlCDataSection)(doc.SelectSingleNode("section/description").ChildNodes[0]);
    
    string finalData = cDataNode.Data;
    
        3
  •  9
  •   Siva Charan    13 年前

    事实上,我觉得很简单。这个 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();
    

    谢谢
    新达克斯

        4
  •  4
  •   Arithmomaniac    6 年前

    更简单的形式 @Franky's solution :

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

    这个 Value 财产 is equivalent Data 铸造的财产 XmlCDataSection 类型。

        5
  •  3
  •   Pavel Minaev    15 年前

    CDATA块实际上是逐字逐句的。根据XML规范,从定义上讲,CDATA中的任何空白都是重要的。因此,在检索节点值时会得到空白。如果您想使用自己的规则来剥离它(因为XML规范没有指定任何标准的方法来剥离CDATA中的空白),那么您必须使用 String.Replace , Regex.Replace 等等。