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 の場合、おそらく正規表現を介して渡す必要があります。

     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 つ以上の空白を 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にロードされるセクションの違いは、このノードにはプロパティ NodeType = CDATA があることです。つまり、そのノードに純粋なデータが入力されたプロパティがあり、そこにあなたがいるということです。使用する特殊文字を削除したい場合は、データが得られます。XmlDocumentXmlNodeXmlNode node = doc.SelectSingleNode("section/description");ChildNodeInnerTextTrim()

コードは次のようになります

XmlNode cDataNode = doc.SelectSingleNode("section/description").ChildNodes[0];
string finalData = cDataNode.InnerText.Trim();

ありがとう
XOnDaRocks

于 2010-05-07T15:28:21.880 に答える
3

CDATA ブロックは実質的に逐語的です。XML 仕様によると、CDATA 内のすべての空白は、定義上、重要です。したがって、ノード値を取得すると、その空白が取得されます。独自のルールを使用して削除する場合 (XML 仕様では CDATA の空白を削除する標準的な方法が指定されていないため)、必要に応じて などを使用して自分で行うString.Replace必要Regex.Replaceがあります。

于 2009-08-06T05:06:21.587 に答える