Это поведение является фундаментальным для набора информации XML. Эффект объявления xmlns
распространяется на весь дочерний контент; поскольку вы не указали пространство имен для дочернего элемента, стандартное поведение - поместить его в безымянное пространство имен. Чтобы вложить элемент в безымянное пространство имен внутри того, который объявляет пространство имен по умолчанию, объявление xmlns=''
требуется для сброса пространства имен по умолчанию на безымянное.
Подводя итог, на основе вашего редактирования:
- Если вам не нужны пространства имен в ваших дочерних элементах, то явное
xmlns=''
требуется согласно спецификации XML Namespaces , чтобы переопределить пространство имен, объявленное в элементе документа.
- Если вам не нужны объявления пространства имен ( т.е.
xmlns=''
stuff) в ваших дочерних элементах, вы должны убедиться, что такое же пространство имен добавлено в имена всех из них в коде.
Я не знаю, как заставить XElement
автоматически наследовать пространство имен своего родителя. После того, как вы закончите сборку DOM, вы всегда можете постобработать его, чтобы везде установить одно пространство имен с чем-то похожим на это:
foreach(var element in doc.Descendants())
element.Name = aw + element.Name.LocalName;
Я не верю, что делать это рекомендуется для чего-то другого, кроме одноразового кода, так как он, вероятно, будет иметь неблагоприятные последствия для удобства сопровождения. Ряд XML-документов, с которыми мне приходилось иметь дело со смешанными пространствами имен, и «разрушение» пространств имен, как это делает приведенный выше фрагмент кода, могут привести к срыву семантики документа со смешанным пространством имен.