Re: MS XML 4.0 DOMDocument. Добавление элемента
От: Аноним  
Дата: 24.01.02 11:53
Оценка:
Здравствуйте Павел Дмитриев, Вы писали:

ПД>Доброго времени суток всем!


ПД>Есть такой пример


ПД>
ПД><?xml version="1.0"?>
ПД><Collection xmlns="books">
ПД>    <Book>
ПД>        <Title>Cosmos</Title>
ПД>        <Author>Carl Sagan</Author>
ПД>        <Publisher>Ballantine Books</Publisher>
ПД>    </Book>
ПД></Collection>
ПД>



ПД>Добавляем новый элемент <Book>



ПД>
ПД>root = XMLDoc.documentElement
ПД>newElem2 = XMLDoc.createElement("Book")
ПД>root.appendChild(newElem2)
ПД>


ПД>Получаем:


ПД>
ПД><?xml version="1.0"?>
ПД><Collection xmlns="books">
ПД>    <Book>
ПД>        <Title>Cosmos</Title>
ПД>        <Author>Carl Sagan</Author>
ПД>        <Publisher>Ballantine Books</Publisher>
ПД>    </Book>
ПД>    <Book xmlns=""/>
ПД></Collection>
ПД>


ПД>Почему в созданный элемент Book добавляется атрибут xmlns="" :???: Как с этим боротся?

ПД>
Павел, попытаюся ответить на твой вопрос.

В документе каждый узел относится к какому-либо пространству имен.
Для этого служит конструкция prefix:xmlns="namespace-uri", где namespace-uri -- uri пространства имен,
а prefix -- соотбетственно префикс. Этот префикс в последствии можно использовать для указания
принадлежности узла к соответствующему пространству имен. Если префикс у узла в исходном документе
не указан, то uri пространства имен для этого узла берется у первого из его предков, у которого он
указан.

В твоем случае в документе ни у одного из элементов (кроме корневого) не указано ни uri пространства
имен, ни префикса и поэтому их uri пространства имен предполагается равным пространству имен корневого
элемента, то есть "books".

Создавая узел при помощи createElement, ты не указываешь uri пространства имен и оно предполагается
пустым (""). Если бы при вставку парсер опустил бы аттрибут xmlns, то при считывании этого узла,
предполагалось бы, что uri пространства имен нового элемента был бы равен пространству имен корневого
элемента, то есть books. А это не верно, так как ты не указывал при создании узла, что ты хочешь
отнести его к пространству с uri "books".

Для того, чтобы решить твою проблему, можно вместо createElement использовать createNode:

IXMLDOMDocument.createNode(Type, name, namespaceURI);


у которого в качестве Type указать 1 (NODE_ELEMENT), а вкачестве namespaceURI -- "books" и тогда все
будет как ты и предполагал (xmlns="" создан не будет).

Или отказаться от использования пространств имен.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.