В XML, когда элементу не определено пространство имен, он наследует пространство имен своего ближайшего предка, который имеет пространство имен. Итак, в вашем примере XML элемент p
и его дочерние элементы фактически находятся в том же пространстве имен, что и Issue
, поскольку они не имеют атрибута xmlns
, в то время как Issue
.
Чтобы создать эту же структуру, используя XElement
, вам необходимо убедиться, что все элементы задают то же пространство имен, что и Issue
:
var ns = XNamespace.Get("http://tempuri.org/");
XElement e = new XElement(ns + "Issue",
new XElement(ns + "p", new XElement(ns + "Nombre", "nme"),
new XElement(ns + "Descripcion", "dsc")));
XElement
достаточно умен, чтобы признать, что при преобразовании в строку ему не нужно повторять атрибут xmlns
, если он совпадает с атрибутом его родителя.
Скрипка: https://dotnetfiddle.net/QzYPoK
И наоборот, если вы просто указываете пространство имен на внешнем XElement
, но не на внутреннем, вы фактически говорите, что не хотите, чтобы у внутренних элементов было пространство имен вообще. В результате получается пустой атрибут xmlns
в первом дочернем элементе: он фактически «отказывается» от родительского пространства имен.