Почему этот LINQ to XML не работает? - PullRequest
1 голос
/ 21 сентября 2011

Я получаю этот XML из внешнего источника:

<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
  <response>
    <result code="1300">
      <msg>Command completed successfully; no messages</msg>
    </result>
    <trID>
      <clTRID>TEST-12345</clTRID>
      <svTRID>IRNIC_2011-09-21T13:44:25+04:30_f1u</svTRID>
    </trID>
  </response>
</epp>

Я хочу извлечь значение атрибута кода элемента результата .Я использовал этот код:

XDocument doc = XDocument.Parse(response);
XNamespace ns = "urn:ietf:params:xml:ns:epp-1.0";
string value = doc.Descendants(ns + "result").First().Attribute("code").Value;

Однако, он выдает исключение нулевого значения, потому что doc.Descendants(ns + "result") равно нулю.

Что здесь не так?

Ответы [ 4 ]

3 голосов
/ 21 сентября 2011

Однако, он выдает исключение пустого значения, потому что doc.Descendants (ns + "result") равно null

Я бы не ожидал, что doc.Descendants до когда-либо вернут null - он мог бы вернуть пустую последовательность, но это не было бы «исключением нулевого значения». Аналогично, First() - он либо возвращает что-то , либо выдает исключение (и хотя это "что-то" может быть null, я не ожидаю, что Descendants приведет к null s ). Так что остается .Attribute("code").Value. Сейчас да; .Attribute("code") может вернуть null, если атрибут не существует. Если вы счастливы получить null в этих случаях, я рекомендую:

string value = (string)doc.Descendants(ns + "result").First().Attribute("code");

оператор преобразования обрабатывает нулевые (несуществующие) атрибуты.

1 голос
/ 23 сентября 2011

Протестировал это тоже.Самый простой способ проверить это - загрузить LinqPad, создать новый запрос, а затем для языка выбрать «операторы C #» из выпадающего списка.Нажмите Run, должно работать с предоставленным кодом.Я также проверил бы переменную ответа, как предложено "Rased Dot Net"

string xml =
@"<epp xmlns=""urn:ietf:params:xml:ns:epp-1.0"">
  <response>
    <result code=""1300"">
      <msg>Command completed successfully; no messages</msg>
    </result>
    <trID>
      <clTRID>TEST-12345</clTRID>
      <svTRID>IRNIC_2011-09-21T13:44:25+04:30_f1u</svTRID>
    </trID>
  </response>
</epp>";

XDocument doc = XDocument.Parse(xml);
Console.WriteLine(doc.ToString());
XNamespace ns = doc.Root.Name.Namespace;
Console.WriteLine("Namespace: " + ns.ToString());
string value = doc.Descendants(ns + "result").First().Attribute("code").Value;
Console.WriteLine(value);
1 голос
/ 21 сентября 2011

Проверьте response переменную, потому что я загрузил XML из XML-файла, и ваш код работал отлично.

В случае тестирования вы можете сохранить ответ в файле XML и загрузить его оттуда.

используйте XDocument.Load("a.xml") для загрузки XML-файла.

1 голос
/ 21 сентября 2011

Нет воспроизведения.Ваш код в основном в порядке.

Итак: отладка.Разбейте утверждение и проверьте вещи.

  • Ваш doc загружен в порядке?
  • что только doc.Descendants(ns + "result").First() доставляет?
  • и т. Д.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...