Добавить атрибут пространства имен XML в сторонний xml? - PullRequest
1 голос
/ 20 января 2009

Я использую 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 - Префикс '' нельзя переопределить из '' в 'name' в том же теге начального элемента.

но

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

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

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

Спасибо!


Обновление

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

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

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

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

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

Спасибо!

1 Ответ

2 голосов
/ 20 января 2009

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

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

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

...