Непонятная проблема с XmlDocument
От: Владимир Гренадеров Россия  
Дата: 20.07.04 12:32
Оценка:
Как известно, метод CreateElement может помимо названия элемента принимать и NamespaceURI.

Вот мой код, который использует неймспейсы (далее я использую схему для проверки документа):

doc.AppendChild(doc.CreateElement("root","http://tempuri.org/Configuration.xsd"));
XmlElement optionsElement = doc.CreateElement("options");
doc.DocumentElement.AppendChild(optionsElemnt);
XmlElement p1 = doc.CreateElement("p1");
optionsElement.AppendChild(p1);


В результате, должен получится документ вида:
<root xmlns="http://tempuri.org/XTS/Configuration.xsd">
<options>
<p1 />
</options>
</root>

но в реальности мы имеем:
<root xmlns="http://tempuri.org/XTS/Configuration.xsd">
<options xmlns="">
<p1 />
</options>
</root>

у дочернего элемента пустой неймспейс, а еще ниже атрибут вообще пропадат...
данный феномен проявляется при любой комбинации тегов, и уровне вложенности.

и у меня вопрос к уважаемым RSDN'овцам — это нормальное поведение XmlDocumenta, или мой кривой код? заранее спасибо за ответы.

ЗЫ пишу в VS 2003, фреймворк соотв. версии 1.1
OK
Re: Непонятная проблема с XmlDocument
От: ZORK Россия www.zorkaltsev.com
Дата: 20.07.04 12:45
Оценка:
Здравствуйте, Владимир Гренадеров, Вы писали:

ВГ>и у меня вопрос к уважаемым RSDN'овцам — это нормальное поведение XmlDocumenta, или мой кривой код? заранее спасибо за ответы.


Это нормальное и вполне объяснимое поведение. Ты же явно сказал что options в пустом namespace'е, что в XML и получилось. Если хочешь чтоб options был в нужном тебе namespace'е, то надо его указывать так же как и для root'а.

-zork
Думать надо ...головой :)
Re[2]: Непонятная проблема с XmlDocument
От: Владимир Гренадеров Россия  
Дата: 20.07.04 14:01
Оценка:
Здравствуйте, ZORK, Вы писали:

ZOR>Это нормальное и вполне объяснимое поведение. Ты же явно сказал что options в пустом namespace'е, что в XML и получилось. Если хочешь чтоб options был в нужном тебе namespace'е, то надо его указывать так же как и для root'а.


Это не нормальное поведение — поскольку если не указывать неймспейс явно (как у эл-та P1 в моем примере), то атрибут xmlns вообще не будет вставлен, и в качестве неймспейса будет использован "вышестоящий". Меня инетересует, почему в одном случае, когдя я явно не задаю пространство имен, оно считается "пустым", а в другом — оно вообще не определено. разница — как между "" и NULL в СУБД.

По-умолчанию, если не указывать пространство имен при работе с XmlDocument, атрибут xmlns не используется вообще....

Проблему я уже решил методом "в лоб" — задаю явно неймспейс при каждом вызове CreateElement — и тогда получаю нужный вид документа. Остался лишь чисто научный интерес — да еще и нет желания попасть на подобные грабли в следующий раз
OK
Re[3]: Re: Непонятная проблема с XmlDocument
От: trolik Россия  
Дата: 20.07.04 14:08
Оценка:
Здравствуйте, Владимир Гренадеров, Вы писали:


ВГ>Это не нормальное поведение — поскольку если не указывать неймспейс явно (как у эл-та P1 в моем примере), то атрибут xmlns вообще не будет вставлен, и в качестве неймспейса будет использован "вышестоящий". Меня инетересует, почему в одном случае, когдя я явно не задаю пространство имен, оно считается "пустым", а в другом — оно вообще не определено. разница — как между "" и NULL в СУБД.

Для элемента options ты не задал namespace и ему явно прописали пустой иначе он бы отнаследовал родительский namespace.
Значит для p1 путой namespace прописывать необязательно, потому что он отнаследуется от options. Вроде так.
Re[4]: Re: Непонятная проблема с XmlDocument
От: Владимир Гренадеров Россия  
Дата: 21.07.04 05:42
Оценка:
Здравствуйте, trolik, Вы писали:

T>Для элемента options ты не задал namespace и ему явно прописали пустой иначе он бы отнаследовал родительский namespace.

T>Значит для p1 путой namespace прописывать необязательно, потому что он отнаследуется от options. Вроде так.

в этом то и проблема — options имеет пустой неймспейс. ладно, положим, я его не указал явно (хотя в таком случае атрибут xmlns просто не применяется к элементу), но почему и p1, и options НЕ НАСЛЕДУЮТ родительские неймспесы, а ведут себя, как им заблогарассудится?
OK
Re[5]: Re: Непонятная проблема с XmlDocument
От: just_dmitry Россия www.parsec-club.ru
Дата: 21.07.04 07:38
Оценка:
ВГ>в этом то и проблема — options имеет пустой неймспейс. ладно, положим, я его не указал явно (хотя в таком случае атрибут xmlns просто не применяется к элементу), но почему и p1, и options НЕ НАСЛЕДУЮТ родительские неймспесы, а ведут себя, как им заблогарассудится?

Влезаем в System.Xml:

public XmlElement CreateElement(string name) {
    string local0;
    string local1;

    local0 = String.Empty;
    local1 = String.Empty;
    XmlNode.SplitName(name, local0, local1);
    return this.CreateElement(local0, local1, String.Empty);
}


public XmlElement CreateElement(string qualifiedName, string namespaceURI) {
    string local0;
    string local1;

    local0 = String.Empty;
    local1 = String.Empty;
    XmlNode.SplitName(qualifiedName, local0, local1);
    return this.CreateElement(local0, local1, namespaceURI);
}


public virtual XmlElement CreateElement(string prefix, string localName, string namespaceURI) {
    XmlElement local0;

    local0 = new XmlElement(this.GetXmlName(prefix, localName, namespaceURI), 1, this);
    if (!(this.IsLoading))
        this.AddDefaultAttributes(local0);
    return local0;
}


Все создаваемые излы имеют определенный неймспейс. Для OPTION и P испоьлзуется пустая строка, т.к. явно не указано иное.
То что получается в результате OuterXML, собирается на лету. При выводе каждого дочернего проверяется его неймспейс. Не совпадает с родителем — указывается. Совпадает — не указывается (по спецификации как я помню можно указывать неймспейс для всех узлов, и это не будет ошибкой).
Т.о. неймспейс OPTION <> неймспейс ROOT, вот он и указывается. Неймспейс Р = неймспейс OPTION, он указывается.

Ведь ты дже сначала создаешь элемент, потом его кому-то добавляешь. Соответственно на этапе создания никто не догадается в какого родителя ты его потом положишь и какой неймспейс присвоить этой ветви. А впоследствии при добавлении никто и не будет менять неймспейс, это уже совсем бред получится.
Re[6]: Re: Непонятная проблема с XmlDocument
От: Владимир Гренадеров Россия  
Дата: 21.07.04 14:21
Оценка:
Здравствуйте, just_dmitry, Вы писали:

ВГ>>в этом то и проблема — options имеет пустой неймспейс. ладно, положим, я его не указал явно (хотя в таком случае атрибут xmlns просто не применяется к элементу), но почему и p1, и options НЕ НАСЛЕДУЮТ родительские неймспесы, а ведут себя, как им заблогарассудится?


_>Все создаваемые излы имеют определенный неймспейс. Для OPTION и P испоьлзуется пустая строка, т.к. явно не указано иное.

_>То что получается в результате OuterXML, собирается на лету. При выводе каждого дочернего проверяется его неймспейс. Не совпадает с родителем — указывается. Совпадает — не указывается (по спецификации как я помню можно указывать неймспейс для всех узлов, и это не будет ошибкой).
_>Т.о. неймспейс OPTION <> неймспейс ROOT, вот он и указывается. Неймспейс Р = неймспейс OPTION, он указывается.
_>Ведь ты дже сначала создаешь элемент, потом его кому-то добавляешь. Соответственно на этапе создания никто не догадается в какого родителя ты его потом положишь и какой неймспейс присвоить этой ветви. А впоследствии при добавлении никто и не будет менять неймспейс, это уже совсем бред получится.

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