2009-07-11 1 views
1

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

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

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

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

+0

Вы хотите добавить пространство имен по умолчанию к элементу, который должен был быть назначен? например XMLNS = "someuri" – AnthonyWJones

ответ

1

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

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

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

Смежные вопросы