2016-08-18 5 views
-1

Я пытаюсь разобрать мой xml, который имеет тег CData как значение для одного из его узлов. Моя структура XML выглядит следующим образом.Разбор CData из XML в C#

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

Мой код такой, как показано ниже. Когда я разбираюсь, я получаю ответ с тегом CData, а не значением в теге CData. Можете ли вы помочь мне исправить мою проблему?

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, дайте мне знать, если вам нужно больше деталей.

+0

Есть ли причина, по которой этот вопрос был приостановлен? Я попытался обеспечить всю необходимую информацию. – csharpnewbie

ответ

-1

Это потому, что StreamReader избежал html. «<» был заменен на "&lt;". Следовательно, он не получил правильного признания в качестве cdatatag. Так что пришлось сделать unescape first - XDocument xmlDoc = XDocument.Parse(HttpUtility.HtmlDecode(responseString))

и что исправил его.

3

То, что вы описываете, никогда не произойдет. Получение Value узла, содержащего cdata в качестве ребенка, даст вам содержимое внутреннего текста cdata. Вы уже должны получать ожидаемый результат.

Единственный способ получить фактический узел cdata - это если вы действительно получаете узел cdata.

var cdata = node1Element.Element("node2").FirstNode; 
+0

Но это результат, который я получаю, и не уверен, что я пропустил что-то очевидное. Поэтому я хотел проверить со сверстниками здесь. Я знаю, что должен получить содержимое cdata, но нет. – csharpnewbie

+0

Во-первых, попробуйте воспроизвести проблему, не получая данные от ответа. Создайте строку с содержимым этого ответа и запустите эту строку через код в отдельной программе. Вы не получите то, что говорите, что получаете. Если вы каким-то образом это сделаете, значит, ваша строка ввода - это то, что вы здесь разместили. Отправьте эту строку, если она соответствует тому, что вы говорите. –

+0

Автономная консольная программа со строкой отлично работает и производит результат, как ожидалось, - только текст внутри тега cdata. Но когда я запускаю свой фактический код с ответом от сервера, он не работает нормально. – csharpnewbie

0

Я попробовал ваш код и значение CData верны ...?!?

как вы заполняете свой ответ? :-)

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. Таким образом, «<» изменилось на «<». Так что сначала нужно было выполнить unescape - XDocument xmlDoc = XDocument.Parse (HttpUtility.HtmlDecode (responseString)) и исправил его. – csharpnewbie