MSXML DOM: добавить объявление пространства имен к существующему узлу в дереве - PullRequest
1 голос
/ 12 июля 2009

Описание проблемы: Считайте файл XML, перейдите к определенному узлу (элементу), если у него нет определенного объявления пространства имен, добавьте требуемое объявление пространства имен и запишите файл.

Мне нужно сделать это на C ++, используя Microsoft MSXML DOM API. Свойство namespaceURI в COM-объекте IXMLDOMNode доступно только для чтения в соответствии с этим msdn reference . Цените любые обходные пути.

Редактировать : я потратил довольно много времени на обходной путь: создайте новый одноуровневый узел в том же документе с нужным мне пространством имен, затем переместите все дочерние элементы исходного узла в этот новый узел, затем удалите исходный узел. Что ж, это не работает, потому что дочерние узлы сохранят то пространство имен по умолчанию, которое у них было раньше.

И затем эта простая идея поразила меня, и она сработала, но я не уверен, что она укусит меня в будущем: просто создайте атрибут «xmlns» для элемента, задав ему желаемое значение пространства имен! Есть комментарии?

1 Ответ

1 голос
/ 12 июля 2009

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

Самым строгим подходом будет обработка XML в качестве входных данных для преобразования (либо в коде, либо через XSLT), который генерирует исправленный вывод XML.

Однако прагматичным решением было бы использовать некоторую обработку строк, такую ​​как RegEx, чтобы найти элемент и ввести атрибут xmlns. Лично я предпочитаю первое.

...