ВГ>в этом то и проблема — 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, он указывается.
Ведь ты дже сначала создаешь элемент, потом его кому-то добавляешь. Соответственно на этапе создания никто не догадается в какого родителя ты его потом положишь и какой неймспейс присвоить этой ветви. А впоследствии при добавлении никто и не будет менять неймспейс, это уже совсем бред получится.