Al generar XML a partir de XmlDocument en .NET, xmlns
aparece un atributo en blanco la primera vez que se inserta un elemento sin un espacio de nombres asociado; ¿Cómo se puede prevenir esto?
Ejemplo:
XmlDocument xml = new XmlDocument();
xml.AppendChild(xml.CreateElement("root",
"whatever:name-space-1.0"));
xml.DocumentElement.AppendChild(xml.CreateElement("loner"));
Console.WriteLine(xml.OuterXml);
Salida:
<root xmlns="whatever:name-space-1.0"><loner xmlns="" /></root>
Salida deseada :
<root xmlns="whatever:name-space-1.0"><loner /></root>
¿Existe una solución aplicable al XmlDocument
código, no algo que ocurre después de convertir el documento a una cadena con OuterXml
?
Mi razonamiento para hacer esto es ver si puedo igualar el XML estándar de un protocolo en particular usando XML generado por XmlDocument. El xmlns
atributo en blanco no puede romper o confundir a un analizador, pero tampoco está presente en ningún uso que haya visto de este protocolo.
fuente
doc.DocumentElement.NamespaceURI
) pero no especifique un espacio de nombres para elCreateAttribute()
que obtendráxmlns:psomething
incluso si es el mismo uri.Esta es una variante de la respuesta de JeniT (¡Muchas gracias por cierto!)
Esto elimina tener que copiar o repetir el espacio de nombres en todas partes.
fuente
Si el
<loner>
elemento en su XML de muestra no tenía laxmlns
declaración de espacio de nombres predeterminada, entonces estaría en elwhatever:name-space-1.0
espacio de nombres en lugar de estar en ningún espacio de nombres. Si eso es lo que desea, debe crear el elemento en ese espacio de nombres:Si desea que el
<loner>
elemento no esté en un espacio de nombres, entonces el XML que se ha producido es exactamente lo que necesita, y no debe preocuparse por elxmlns
atributo que se agregó automáticamente para usted.fuente
Dado que root está en un espacio de nombres sin prefijo, cualquier hijo de root que quiera tener un espacio de nombres sin nombre tiene que salir como su ejemplo. La solución sería prefijar el elemento raíz así:
código:
fuente
Si es posible, cree una clase de serialización y luego haga lo siguiente:
Es más seguro y puede controlar los espacios de nombres con atributos si realmente necesita más control.
fuente
Resolví el problema usando Factory Pattern. Creé una fábrica para objetos XElement. Como parámetro para la creación de instancias de la fábrica, he especificado un objeto XNamespace. Por lo tanto, cada vez que la fábrica crea un XElement, el espacio de nombres se agregará automáticamente. Aquí está el código de fábrica:
fuente
XmlDocument
, noXDocument
.Sí, puede evitar XMLNS del XmlElement. El tiempo de la primera creación se acerca: así
Cambie el código: y pase el espacio de nombres xml como este
Código C #:
fuente