2015-08-09 2 views
0

У меня возникла проблема с анализом одного определенного значения из документа XML. Код, я использую выглядит следующим образом:Исключение синтаксического анализа XML в C#

WebResponse response = request.GetResponse(); 
Stream responseStream = response.GetResponseStream(); 
XDocument doc = XDocument.Load(responseStream); 
XElement root = doc.Root; 
ClassVars.LastTimeStamp = (int)root.Elements("TIMESTAMP").Last(); 

Тем не менее, этот код генерирует следующее исключение:

Необработанное исключение типа «System.InvalidOperationException» произошло в System.Core. Dll

(сообщение полная ошибка here.)

И вполне откровенно, я не могу подумайте о жизни меня. Линия, на которой он ошибается, - это линия ClassVars.LastTimeStamp = (int)root.Elements("TIMESTAMP").Last();. Я пытаюсь разобрать это из следующего XML:

<REGION> 
<MESSAGES> 
<POST> 
<TIMESTAMP>1439137652</TIMESTAMP> 
<NATION>...</NATION> 
<MESSAGE> 
</MESSAGE> 
</POST> 
... 
... 
... 
<POST> 
<TIMESTAMP>1439137856</TIMESTAMP> 
<NATION>...</NATION> 
<MESSAGE> 
... 
</MESSAGE> 
</POST> 
</MESSAGES> 
</REGION> 

То, что я хочу сделать, это извлечь TIMESTAMP из последнего сообщения в файле. Может ли кто-нибудь сказать мне, что я делаю неправильно? Это, наверное, ослепительно очевидно, но я просто этого не вижу.

+0

Не могли бы вы вставить сообщение об ошибке? – Douglas

+0

@ Дуглас: слишком долго для комментария, см. Http://pastebin.com/sKP4jFZ2 –

+0

@TaW Я такой глупый, извините! Я все еще использовал тестовый ключ в своем WebRequest. Спасибо, что заставило меня понять, хе-хе! –

ответ

3

Проблема в том, что вы используете неправильный метод для извлечения элементов <TIMESTAMP>. XElement.Elements только возвращает ребенка элементов. В вашем случае имеет три уровня глубины, поэтому вместо этого вам нужно использовать Descendants.

ClassVars.LastTimeStamp = (int)root.Descendants("TIMESTAMP").Last(); 
+0

Я думаю, что лучшей альтернативой является изучение [XPath] (https://msdn.microsoft.com/en-us/library/ms256086 (v = vs.110) .aspx) и предоставление пути к дочернему элементу. Это гораздо более стабильное решение. – GregRos

+0

@ GreĝRos: Я согласен с тем, что это будет лучше дисциплинировать, особенно если валидация пути важна. С другой стороны, может быть, что OP не заботится о точной структуре XML и хочет, чтобы код все еще работал, если структура изменяется. – Douglas

+0

@ Дуглас прав - я использую API, который меняет справедливое отношение, и мне не очень-то нравится структура - мне просто нужно разобрать этот бит как переменную в моем коде. –

1

Предполагая, что это весь документ (за исключением заголовка), область является единственным элементом корня. Попробуйте использовать Потомки вместо.