xsltcontext usa tipos tipo sirve que programacion pero para nombres necesario namespace espacios espacio como comandos codigos administrador c# .net xml xmlwriter

c# - usa - Gestión adecuada del espacio de nombre en.NET XmlWriter



tipos de namespace (4)

Esta publicación puede ser útil. También eche un vistazo a la propiedad Namespaces de las clases XmlTextWriter / XmlTextReader .

Utilizo las tecnologías .NET XML bastante extensamente en mi trabajo. Una de las cosas que más me gusta es el motor XSLT, más precisamente su extensibilidad. Sin embargo, hay una pequeña pieza que sigue siendo una fuente de molestia. Nada importante o algo con lo que no podamos vivir, pero nos impide producir el hermoso XML que nos gustaría producir.

Una de las cosas que hacemos es transformar nodos en línea e importar nodos de un documento XML a otro.

Lamentablemente, cuando guardas nodos en un XmlTextWriter (en realidad, lo que XmlWriter.Create(Stream) devuelve), las definiciones del espacio de nombres se lanzan allí, independientemente de si es necesario (previamente definido) o no. Obtienes el siguiente tipo de xml:

<root xmlns:abx="http://bladibla"> <abx:child id="A"> <grandchild id="B"> <abx:grandgrandchild xmlns:abx="http://bladibla" /> </grandchild> </abx:child> </root>

¿Alguien tiene una sugerencia sobre cómo convencer .NET para ser eficiente sobre sus definiciones de espacio de nombres?

Gracias, Boaz

PD. Como una ventaja adicional, me gustaría sobrescribir el espacio de nombres predeterminado, cambiándolo a medida que escribo un nodo.


No estoy seguro de que esto sea lo que estás buscando, pero puedes usar este tipo de código cuando comiences a escribir en la secuencia Xml:

myWriter.WriteAttributeString("xmlns", "abx", null, "http://bladibla");

El XmlWriter debería recordarlo y no reescribirlo más. Puede que no sea 100% a prueba de balas, pero funciona la mayor parte del tiempo.


Usa este código:

using (var writer = XmlWriter.Create("file.xml")) { const string Ns = "http://bladibla"; const string Prefix = "abx"; writer.WriteStartDocument(); writer.WriteStartElement("root"); // set root namespace writer.WriteAttributeString("xmlns", Prefix, null, Ns); writer.WriteStartElement(Prefix, "child", Ns); writer.WriteAttributeString("id", "A"); writer.WriteStartElement("grandchild"); writer.WriteAttributeString("id", "B"); writer.WriteElementString(Prefix, "grandgrandchild", Ns, null); // grandchild writer.WriteEndElement(); // child writer.WriteEndElement(); // root writer.WriteEndElement(); writer.WriteEndDocument(); }

Este código produjo el resultado deseado:

<?xml version="1.0" encoding="utf-8"?> <root xmlns:abx="http://bladibla"> <abx:child id="A"> <grandchild id="B"> <abx:grandgrandchild /> </grandchild> </abx:child> </root>


¿Has intentado esto?

Dim settings = New XmlWriterSettings With {.Indent = True, .NamespaceHandling = NamespaceHandling.OmitDuplicates, .OmitXmlDeclaration = True} Dim s As New MemoryStream Using writer = XmlWriter.Create(s, settings) ... End Using

Interesante es el ''NamespaceHandling.OmitDuplicates''