Добавить атрибут пространства имен XML в сторонний xml?

Я использую VB 2008 и пытаюсь добавить атрибут xmlns="mynamespace" в корневой элемент XDocument.

XML-документ создан третьей стороной, и я загрузил его в объект VB XDocument. Как оказалось, у него нет пространств имен. Я работал над локальной копией и добавил пространство имен в текстовом редакторе, чтобы использовать XMLToSchema в VB для включения Intellisense и т. д., в соответствии с инструкциями в видеороликах Бет Масси по адресу MSDN. Теперь остальная часть кода работает. Я хочу снова открыть живые документы. Без пространства имен мои XML-литералы не разрешаются.

Я безуспешно пытался добавить свойство XMLNS к корневому тегу, используя несколько методов, и самым близким из них были следующие три примера кода.

Dim myNS As XNamespace = "urn:nbf:namespacename"
myXML.Element("nameofrootelement").Add(myNS)

^^^^ Пространство имен было добавлено как значение корневого элемента, а не как атрибут.

XML.Root.Add(New XAttribute("xmlns", "name"))

^^^^ Сгенерирована ошибка: Исключение во время выполнения: System.Xml.XmlException - префикс '' не может быть переопределен с '' на 'имя' в одном и том же теге начального элемента.

но

XML.Root.Add(New XAttribute("test", "name"))

^^^^ работает корректно. Предположительно, ему не нравится, что я вручную пытаюсь установить зарезервированный атрибут? Это пространство имен кажется слишком сложным из-за некоторых поисков в Google, которые я сделал.

Как обойти эту проблему? :D

Спасибо!


Обновить

Спасибо Энтони.

Я думаю, мне нужно лучше понять пространства имен.

Я думал .ToString его, затем изменить, а затем .Parse тоже, но мне нужно было лучшее решение, чтобы оно помогло мне немного лучше понять его! Однако я пробовал это, и, как вы правильно заметили, это влияет и на всех потомков, поэтому оно все еще ломается.

Я буду работать с несколькими XML-потоками, созданными разными третьими сторонами, и я думаю, что для простоты я полностью упущу пространство имен!

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

Спасибо!


person user57087    schedule 20.01.2009    source источник


Ответы (1)


Вы должны понимать, что истинное полное имя любого тега — это имя тега, которое отображается в XML (известное как локальное имя) и пространстве имен. Пытаясь поместить xmlns="xxx" в элемент, вы фактически пытаетесь переименовать этот элемент и все его потомки, которым явно не назначено собственное пространство имен.

Точно так же, как тэг читается только для элемента, пространство имен этого элемента доступно только для чтения.

Возможно, самым простым решением (при условии, что вы не можете заставить третью сторону правильно создать XML) было бы вставить xmlns в текст перед синтаксическим анализом.

person AnthonyWJones    schedule 20.01.2009