c# - xsltcontext - using system para que sirve




Gestión adecuada del espacio de nombre en.NET XmlWriter (3)

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.


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


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.


¿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'





xmlwriter