2008-08-25 13 views
15

Utilizo las tecnologías .NET XML de forma bastante extensa 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.Gestión adecuada del espacio de nombres en .NET XmlWriter

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

Lamentablemente, cuando se guarda nodos a un XmlTextWriter (en realidad cualquier XmlWriter.Create(Stream) devoluciones), las definiciones de espacio de nombres obtener todos arrojados allí, sin tener en cuenta que es necesario (se han definido anteriormente) o no. Se obtiene 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 en cuanto a cómo convencer a .NET para ser eficiente sobre sus definiciones de espacio de nombres?

Gracias, Boaz

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

Respuesta

0

This publicación puede ser útil. También echa un vistazo a espacios de nombres propiedad de XmlTextWriter \ XmlTextReader clases.

+0

'' XmlTextReader' y XmlTextWriter' se amortizan en esencia, y no pueden ser utilizados directamente si se está trabajando con los métodos de 'create' recomendados. En cualquier caso, esto fue aquí cuando agregué la recompensa, así que espero que no sea elegible. No responde la pregunta, que está perfectamente redactada como tal, * viz *, "cómo convencer a .NET para que sea eficiente acerca de sus definiciones de espacio de nombres". Otorgo que solo sea posible a través de un lector o escritor personalizado, pero eso es un truco si hay una solución nativa. – harpo

1

No estoy seguro de que esto es lo que está buscando, pero se puede usar este tipo de código cuando empezar a escribir en la secuencia XML:

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

El XmlWriter debe recordar y no volver a escribir es más. Puede que no sea 100% a prueba de balas, pero funciona la mayor parte del tiempo.

+0

Debería, pero no es así. Solo para mantener mi pie fuera de mi boca, aunque voy a verificarlo ahora. – harpo

14

Usar 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 produce la salida deseada:

<?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> 
+0

Cambie eso para usar 'XmlWriter.Create' y lo votaré mejor. –

+0

@John: Listo. Pero, ¿cuál es el punto? ¿Cuales son las posibilidades? –

+4

@polish: ¿probabilidades? ¿Qué quieres decir? El punto es que la gente copie/pegue nuestros ejemplos, y nadie debería usar 'new XmlTextWriter' a partir de .NET 2.0. –

1

¿Usted intentó 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

+0

Es interesante. Aunque estoy en .NET 2.0. – harpo

+0

@harpo: Es .Net 2.0 (vea http://msdn.microsoft.com/de-de/library/ms162617%28v=vs.80%29.aspx) – habakuk

+0

'XmlWriterSettings' es, pero' NamespaceHandling' la propiedad no es http://msdn.microsoft.com/en-us/library/system.xml.xmlwritersettings.namespacehandling%28v=VS.100%29.aspx – harpo

Cuestiones relacionadas