2016-08-18 3 views
-1

CDataタグをノードの1つの値として持つxmlを解析しようとしています。私のXML構造は以下の通りです。C#のXMLからCDataを解析する

<node1> 
<node2> 
<![CDATA[ <[email protected]@@BREAK TYPE="TABLE" @@@--> <P><CENTER>... html goes here.. ]]> 
</node2> 
</node1> 

マイコードは次のとおりです。私が解析すると、私はCDataタグの値ではなくCDataタグで応答します。あなたは私の問題を解決するためにpls助けることができますか?

XDocument xmlDoc = XDocument.Parse(responseString); 
XElement node1Element = xmlDoc.Descendants("node1").FirstOrDefault(); 
string cdataValue = node1Element.Element("node2").Value; 

Actual Output: <![CDATA[ <[email protected]@@BREAK TYPE="TABLE" @@@--> <P><CENTER>... html goes here.. ]]> 

Expected Output: <[email protected]@@BREAK TYPE="TABLE" @@@--> <P><CENTER>... html goes here.. 

私はSystem.XML.Linq.XDocumentが問題を引き起こしていたかどうかわかりませんでした。だから私は以下のようにXMLDocumentバージョンを試してみた。

XmlDocument xmlDoc = new XmlDocument(); 
xmlDoc.LoadXml(responseString); 
XmlNode node = xmlDoc.DocumentElement.SelectSingleNode(@"/node1/node2"); 
XmlNode childNode = node.ChildNodes[0]; 
if (childNode is XmlCDataSection) 
{} 

私のifループはfalseを返します。私のXMLに何か問題があるように見えますが、実際には有効なCDataではありませんか? Plsは私が問題を解決するのを助ける。 詳細が必要な場合は、Plsにお知らせください。

+0

この質問が下落した理由はありますか?私は必要な情報をすべて提供するように努めました。 – csharpnewbie

答えて

-1

これは、StreamReaderがhtmlをエスケープしていたためです。 "<"は"&lt;"に変更されました。したがって、cdatatagとして正しく認識されていませんでした。だから最初にエスケープ解除をしなければならなかった - XDocument xmlDoc = XDocument.Parse(HttpUtility.HtmlDecode(responseString))

それを修正した。

3

説明していることは決して実際には起こりません。子としてcdataを含むノードのValueを取得すると、内部テキストcdataの内容が得られます。あなたはすでにあなたの期待される出力を得ているはずです。

cdataノードを実際に取得すると、実際のcdataノードを取得する唯一の方法があります。

​​3210
+0

しかし、これは出力が得意であり、明白でないものがないかどうかわかりません。そこで私はここで同僚と確認したかったのです。私はcdataの内容を取得するはずですが、私は知っていません。 – csharpnewbie

+0

まず、何らかの応答からデータを取得せずに問題を再現してみてください。その応答の内容を含む文字列を作成し、その文字列を別のプログラムのコードで実行します。あなたは、あなたが得ていることを得ることはできません。何とかしたら、あなたの入力文字列はあなたがここに投稿したものではありません。あなたが言うものと一致する場合は、その文字列を投稿してください。 –

+0

文字列を含むスタンドアロンのコンソールプログラムは、完璧にうまく動作し、期待どおりの結果が得られます。これはcdataタグ内のテキストだけです。しかし、サーバーからの応答で実際のコードを実行すると、正常に動作しません。 – csharpnewbie

0

あなたのコードを試しましたが、CDataの値は正しいですか?

reponseStringをどのように記入しますか? :-)

static void Main(string[] args) 
{ 
    string responseString = "<node1>" + 
          "<node2>" + 
          "<![CDATA[ <[email protected]@@BREAK TYPE=\"TABLE\" @@@--> <P><CENTER>... html goes here.. ]]>" + 
          "</node2>" + 
          "</node1>"; 

    XDocument xmlDoc = XDocument.Parse(responseString); 
    XElement node1Element = xmlDoc.Descendants("node1").FirstOrDefault(); 
    string cdataValue = node1Element.Element("node2").Value; 

    // output: <[email protected]@@BREAK TYPE=\"TABLE\" @@@--> <P><CENTER>... html goes here.. 
} 
+0

@MarxKlaxx、これは、StreamReaderがhtmlをエスケープしていたためです。 "<"は "<"に変更されました。だから最初にエスケープする必要がありました - XDocument xmlDoc = XDocument.Parse(HttpUtility.HtmlDecode(responseString))そしてそれを修正しました。 – csharpnewbie