2016-08-18 2 views
-1

Ich versuche zu analysieren, meine Xml, die CData-Tag als Wert für einen seiner Knoten hat. Meine XML-Struktur ist wie folgt.Parsen CData aus XML in C#

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

Mein Code ist wie folgt. Wenn ich analysiere, erhalte ich eine Antwort mit dem CData-Tag und nicht den Wert im CData-Tag. Können Sie mir bitte helfen, mein Problem zu beheben?

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.. 

Ich war mir nicht sicher, ob System.XML.Linq.XDocument das Problem verursachte. Also habe ich die XMLDocument-Version wie folgt ausprobiert.

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

Und meine if-Schleife gibt false zurück. Sieht so aus, als ob etwas mit meinem XML falsch ist und es ist eigentlich kein gültiges CData? Bitte helfen Sie mir das Problem zu beheben. Bitte lassen Sie mich wissen, wenn Sie weitere Informationen benötigen.

+0

Gibt es einen Grund, warum diese Frage abgelehnt wurde? Ich habe versucht sicherzustellen, dass ich alle notwendigen Informationen zur Verfügung stelle. – csharpnewbie

Antwort

-1

Es war, weil StreamReader das HTML entkam. So wurde "<" geändert in "&lt;". Daher wurde es nicht richtig als CD-Code erkannt. Also musste zuerst unescape machen - XDocument xmlDoc = XDocument.Parse(HttpUtility.HtmlDecode(responseString))

und das reparierte es.

3

Was Sie beschreiben, wird niemals passieren. Das Erhalten der Value eines Knotens, der cdata als Kind enthält, gibt Ihnen den Inhalt des internen Texts cdata. Sie sollten bereits Ihre erwartete Ausgabe erhalten.

Die einzige Möglichkeit, den tatsächlichen cdata-Knoten zu erhalten, ist, wenn Sie tatsächlich den Knoten cdata erhalten.

+0

Aber das ist der Ausgang und ich bin mir nicht sicher, ob etwas offensichtlich fehlt. Daher wollte ich hier mit Gleichgesinnten sprechen. Ich weiß, dass ich den Inhalt von cdata bekommen soll, bin es aber nicht. – csharpnewbie

+0

Versuchen Sie zunächst, das Problem zu reproduzieren, ohne dass Ihre Daten von einer Antwort stammen. Erstellen Sie eine Zeichenfolge mit dem Inhalt dieser Antwort, und führen Sie diese Zeichenfolge in einem separaten Programm durch den Code aus. Du wirst nicht bekommen, was du sagst. Wenn Sie das irgendwie tun, bedeutet das, dass Ihre Eingabezeile _nicht_ ist, was Sie hier gepostet haben. Veröffentlichen Sie diese Zeichenfolge, wenn sie dem entspricht, was Sie sagen. –

+0

Standalone-Konsolen-Programm mit Zeichenfolge funktioniert einwandfrei, und produziert Ergebnis wie erwartet - nur der Text innerhalb des cdata-Tags. Aber wenn ich meinen tatsächlichen Code mit der Antwort vom Server ausführe, funktioniert es nicht gut. – csharpnewbie

0

Ich habe versucht, Ihren Code und der CData-Wert sind korrekt ...?!?

Wie füllen Sie Ihre AntwortString? :-)

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, Es war, weil StreamReader das HTML entkam. So wurde "<" in "<" geändert. Also musste zuerst Unescape machen - XDocument xmlDoc = XDocument.Parse (HttpUtility.HtmlDecode (responseString)) und das hat es behoben. – csharpnewbie