у дочернего элемента пустой неймспейс, а еще ниже атрибут вообще пропадат...
данный феномен проявляется при любой комбинации тегов, и уровне вложенности.
и у меня вопрос к уважаемым RSDN'овцам — это нормальное поведение XmlDocumenta, или мой кривой код? заранее спасибо за ответы.
Здравствуйте, Владимир Гренадеров, Вы писали:
ВГ>и у меня вопрос к уважаемым RSDN'овцам — это нормальное поведение XmlDocumenta, или мой кривой код? заранее спасибо за ответы.
Это нормальное и вполне объяснимое поведение. Ты же явно сказал что options в пустом namespace'е, что в XML и получилось. Если хочешь чтоб options был в нужном тебе namespace'е, то надо его указывать так же как и для root'а.
Здравствуйте, ZORK, Вы писали:
ZOR>Это нормальное и вполне объяснимое поведение. Ты же явно сказал что options в пустом namespace'е, что в XML и получилось. Если хочешь чтоб options был в нужном тебе namespace'е, то надо его указывать так же как и для root'а.
Это не нормальное поведение — поскольку если не указывать неймспейс явно (как у эл-та P1 в моем примере), то атрибут xmlns вообще не будет вставлен, и в качестве неймспейса будет использован "вышестоящий". Меня инетересует, почему в одном случае, когдя я явно не задаю пространство имен, оно считается "пустым", а в другом — оно вообще не определено. разница — как между "" и NULL в СУБД.
По-умолчанию, если не указывать пространство имен при работе с XmlDocument, атрибут xmlns не используется вообще....
Проблему я уже решил методом "в лоб" — задаю явно неймспейс при каждом вызове CreateElement — и тогда получаю нужный вид документа. Остался лишь чисто научный интерес — да еще и нет желания попасть на подобные грабли в следующий раз
ВГ>Это не нормальное поведение — поскольку если не указывать неймспейс явно (как у эл-та P1 в моем примере), то атрибут xmlns вообще не будет вставлен, и в качестве неймспейса будет использован "вышестоящий". Меня инетересует, почему в одном случае, когдя я явно не задаю пространство имен, оно считается "пустым", а в другом — оно вообще не определено. разница — как между "" и NULL в СУБД.
Для элемента options ты не задал namespace и ему явно прописали пустой иначе он бы отнаследовал родительский namespace.
Значит для p1 путой namespace прописывать необязательно, потому что он отнаследуется от options. Вроде так.
Здравствуйте, trolik, Вы писали:
T>Для элемента options ты не задал namespace и ему явно прописали пустой иначе он бы отнаследовал родительский namespace. T>Значит для p1 путой namespace прописывать необязательно, потому что он отнаследуется от options. Вроде так.
в этом то и проблема — options имеет пустой неймспейс. ладно, положим, я его не указал явно (хотя в таком случае атрибут xmlns просто не применяется к элементу), но почему и p1, и options НЕ НАСЛЕДУЮТ родительские неймспесы, а ведут себя, как им заблогарассудится?
ВГ>в этом то и проблема — options имеет пустой неймспейс. ладно, положим, я его не указал явно (хотя в таком случае атрибут xmlns просто не применяется к элементу), но почему и p1, и options НЕ НАСЛЕДУЮТ родительские неймспесы, а ведут себя, как им заблогарассудится?
Все создаваемые излы имеют определенный неймспейс. Для OPTION и P испоьлзуется пустая строка, т.к. явно не указано иное.
То что получается в результате OuterXML, собирается на лету. При выводе каждого дочернего проверяется его неймспейс. Не совпадает с родителем — указывается. Совпадает — не указывается (по спецификации как я помню можно указывать неймспейс для всех узлов, и это не будет ошибкой).
Т.о. неймспейс OPTION <> неймспейс ROOT, вот он и указывается. Неймспейс Р = неймспейс OPTION, он указывается.
Ведь ты дже сначала создаешь элемент, потом его кому-то добавляешь. Соответственно на этапе создания никто не догадается в какого родителя ты его потом положишь и какой неймспейс присвоить этой ветви. А впоследствии при добавлении никто и не будет менять неймспейс, это уже совсем бред получится.
Здравствуйте, just_dmitry, Вы писали:
ВГ>>в этом то и проблема — options имеет пустой неймспейс. ладно, положим, я его не указал явно (хотя в таком случае атрибут xmlns просто не применяется к элементу), но почему и p1, и options НЕ НАСЛЕДУЮТ родительские неймспесы, а ведут себя, как им заблогарассудится?
_>Все создаваемые излы имеют определенный неймспейс. Для OPTION и P испоьлзуется пустая строка, т.к. явно не указано иное. _>То что получается в результате OuterXML, собирается на лету. При выводе каждого дочернего проверяется его неймспейс. Не совпадает с родителем — указывается. Совпадает — не указывается (по спецификации как я помню можно указывать неймспейс для всех узлов, и это не будет ошибкой). _>Т.о. неймспейс OPTION <> неймспейс ROOT, вот он и указывается. Неймспейс Р = неймспейс OPTION, он указывается. _>Ведь ты дже сначала создаешь элемент, потом его кому-то добавляешь. Соответственно на этапе создания никто не догадается в какого родителя ты его потом положишь и какой неймспейс присвоить этой ветви. А впоследствии при добавлении никто и не будет менять неймспейс, это уже совсем бред получится.