Анализируйте XDocument без необходимости указывать пространство имен по умолчанию

StackOverflow https://stackoverflow.com/questions/7387058

Вопрос

У меня есть некоторые XML-данные (аналогичные приведенному ниже образцу), и я хочу прочитать значения в коде.

Почему я вынужден указывать пространство имен по умолчанию для доступа к каждому элементу?Я ожидал, что для всех элементов будет использоваться пространство имен по умолчанию.

Есть ли более логичный способ достичь моей цели?

Образец XML:

общий

Код для чтения элементов xml, которые мне нужны:

общий
Это было полезно?

Решение

Теоретически значение документа не зависит от выбора пользователем префиксов пространства имен.Пока данные находятся в пространстве имен http://www.secretsonline.gov.uk/secrets, не имеет значения, выберет ли автор префикс «s», «secrets», «_x.cafe.babe» или префикс «null» (то есть делает его пространством имен по умолчанию).Ваше приложение не должно заботиться: важен только URI.Вот почему ваше приложение должно указывать URI.

Другие советы

Как было предложено в этом ответе , вы можете сделать это, удалив все пространства имен из копии документа в памяти..Я полагаю, это следует делать только в том случае, если вы знаете, что у вас не будет конфликтов имен в итоговом документе.

общий

Вы можете использовать XmlTextReader.Namespaces для отключения пространств имен при чтении файла XML.

родовое слово

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

Обратите внимание, что элемент Receipts также находится в пространстве имен http://www.secretsonline.gov.uk/secrets, поэтому код XNamespace также потребуется для доступа к элементу:

общий

В качестве альтернативы использованию пространств имен обратите внимание, что вы можете использовать xpath, "не зависящий от пространства имен", используя local-name() и namespace-uri(), например

общий

Если вы опустите предикат namespace-uri:

общий

Соответствует ns1:SomeElement и ns2:SomeElement и т. д. IMO Я всегда предпочитаю, где это возможно, XNamespace, а варианты использования xpath, не зависящие от пространства имен, весьма ограничены, напримердля синтаксического анализа определенных элементов в документах с неизвестными схемами (например, в служебной шине) или для анализа документов, пространство имен которых может измениться (например, будущая проверка, когда генерируемый код кода кода изменяется в соответствии с новой версией схемы документа)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top