Отказоустойчивый синтаксический анализ XML - PullRequest
0 голосов
/ 01 марта 2012

У меня есть XML-документ, который я анализирую и который не следует какой-либо фиксированной схеме.Мне нужно разобрать значения, выполнив что-то вроде этого:

invoiceDetail.PartNO = invoiceLine.Element(ns + "Item").Element(ns + "ItemID").Element(ns + "ID").Value;

В этом примере invoiceLine имеет тип XElement.Проблема в том, что некоторые узлы не всегда существуют, и в этих случаях я бы предпочел возвращать ноль или пустое значение, а не возвращать ошибку.Есть ли способ сделать это в настоящее время, или я должен сам сделать специальную функцию, которая принимает пространство имен и список имен элементов, чтобы попытаться проанализировать в них?

1 Ответ

2 голосов
/ 01 марта 2012

XLINQ уже делает это.
.Element() вернет null, если нет элемента с таким именем.

Чтобы избежать повторяющихся нулевых проверок, используйте .Elements() вместо:

invoiceDetail.PartNO = (string)
    invoiceLine.Elements(ns + "Item")
               .Elements(ns + "ItemID")
               .Elements(ns + "ID")
               .SingleOrDefault();

Каждый Elements() вызов будет возвращать IEnumerable<XElement>. Если нет соответствующих элементов, он вернет пустую последовательность, а остальная часть кода будет работать.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...