write read namespace ejemplo create c# .net xml xml-namespaces xmldocument

read - xmldocument c# ejemplo



¿Cómo evitar los atributos xmlns en blanco en el resultado de XmlDocument de.NET? (7)

Como root está en un espacio de nombres no prefijado, cualquier elemento secundario de la raíz que desee ser sin nombre se debe generar como su ejemplo. La solución sería ponerle un prefijo al elemento raíz así:

<w:root xmlns:w="whatever:name-space-1.0"> <loner/> </w:root>

código:

XmlDocument doc = new XmlDocument(); XmlElement root = doc.CreateElement( "w", "root", "whatever:name-space-1.0" ); doc.AppendChild( root ); root.AppendChild( doc.CreateElement( "loner" ) ); Console.WriteLine(doc.OuterXml);

Al generar XML desde XmlDocument en .NET, aparece un atributo xmlns 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 alguna solución aplicable al código XmlDocument , algo que no ocurre después de convertir el documento en una cadena con OuterXml ?

Mi razonamiento para hacer esto es ver si puedo hacer coincidir el XML estándar de un protocolo particular utilizando XmlDocument-generated XML. El atributo xmlns blanco puede no romper o confundir un analizador, pero tampoco está presente en ningún uso que haya visto de este protocolo.


Esta es una variante de la respuesta de Jenit (¡muchas gracias, por cierto!)

XmlElement new_element = doc.CreateElement("Foo", doc.DocumentElement.NamespaceURI);

Esto elimina tener que copiar o repetir el espacio de nombres en todas partes.


Gracias a la respuesta de Jeremy Lew y un poco más jugando, descubrí cómo eliminar los atributos xmlns blanco: pasar en el espacio de nombres del nodo raíz al crear cualquier nodo secundario en el que no quiera tener un prefijo. Usar un espacio de nombres sin un prefijo en la raíz significa que necesita usar ese mismo espacio de nombres en los elementos secundarios para que ellos tampoco tengan prefijos.

Código fijo:

XmlDocument xml = new XmlDocument(); xml.AppendChild(xml.CreateElement("root", "whatever:name-space-1.0")); xml.DocumentElement.AppendChild(xml.CreateElement("loner", "whatever:name-space-1.0")); Console.WriteLine(xml.OuterXml);

¡Gracias a todos por todas sus respuestas que me llevaron en la dirección correcta!


He resuelto el problema usando el patrón de fábrica. Creé una fábrica para objetos XElement. Como parámetro para la creación de instancias de fábrica, he especificado un objeto XNamespace. Por lo tanto, cada vez que se crea un XElement por la fábrica, el espacio de nombre se agregará automáticamente. Aquí está el código de la fábrica:

internal class XElementFactory { private readonly XNamespace currentNs; public XElementFactory(XNamespace ns) { this.currentNs = ns; } internal XElement CreateXElement(String name, params object[] content) { return new XElement(currentNs + name, content); } }


Sí, puede evitar el XMLNS desde XmlElement. Primero creando el tiempo que viene: así

<trkpt lat="30.53597" lon="-97.753324" xmlns=""> <ele>249.118774</ele> <time>2006-05-05T14:34:44Z</time> </trkpt>

Cambie el código: Y pase el espacio de nombres xml como este

C # code:

XmlElement bookElement = xdoc.CreateElement("trkpt", "http://www.topografix.com/GPX/1/1"); bookElement.SetAttribute("lat", "30.53597"); bookElement.SetAttribute("lon", "97.753324");


Si el elemento <loner> en el XML de muestra no tiene la declaración de espacio de nombres predeterminado xmlns en él, entonces estaría en el whatever:name-space-1.0 nombres whatever:name-space-1.0 lugar de no estar en ningún espacio de nombres. Si eso es lo que quieres, necesitas crear el elemento en ese espacio de nombres:

xml.CreateElement("loner", "whatever:name-space-1.0")

Si quiere que el elemento <loner> esté en ningún espacio de nombres, entonces el XML que se ha producido es exactamente lo que necesita, y no debe preocuparse por el atributo xmlns que se ha agregado automáticamente.


Si es posible, crea una clase de serialización y luego hazlo:

XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); ns.Add("", ""); XmlSerializer serializer = new XmlSerializer(yourType); serializer.Serialize(xmlTextWriter, someObject, ns);

Es más seguro y puede controlar los espacios de nombres con atributos si realmente necesita más control.