2011-08-09 10 views
7

Quiero usar XmlWriter a escribir algo como esto (todo en un espacio de nombres):¿Cómo puedo obligar a XmlWriter a manejar espacios de nombres correctamente?

<Root xmlns="http://tempuri.org/nsA"> 
    <Child attr="val" /> 
</Root> 

pero lo más cerca que puedo lograr es la siguiente:

<p:Root xmlns:p="http://tempuri.org/nsA"> 
    <p:Child p:attr="val" /> 
</p:Root> 

utilizando este código:

using System; 
using System.Text; 
using System.Xml; 

namespace ConsoleApplication1 
{ 
    internal class Program 
    { 
     private const string ns = "http://tempuri.org/nsA"; 
     private const string pre = "p"; 

     private static void Main(string[] args) 
     { 
      var sb = new StringBuilder(); 
      var settings = new XmlWriterSettings 
        { 
         NamespaceHandling = NamespaceHandling.OmitDuplicates, 
              /* ineffective */    
         Indent = true 
        }; 
      using (XmlWriter writer = XmlWriter.Create(sb, settings)) 
      { 
       writer.WriteStartElement(pre, "Root", ns); 
       writer.WriteStartElement(pre, "Child", ns); 
       writer.WriteAttributeString(pre, "attr", ns, "val"); 
              // breaks namespaces  
       writer.WriteEndElement(); 
       writer.WriteEndElement(); 
      } 
      Console.WriteLine(sb.ToString()); 
     } 
    } 
} 

Cuando no se especifica un prefijo, me sale:

<Root xmlns="http://tempuri.org/nsA"> 
    <Child p2:attr="val" xmlns:p2="http://tempuri.org/nsA" /> 
</Root> 

La generación de estos prefijos "fantasmas" en espacios de nombres duplicados se produce en todo el documento generado (p3, p4, p5, etc.).

Cuando no escribo atributos, obtengo el resultado que quiero (excepto que le faltan los atributos, obviamente).

¿Por qué no está XmlWriter omitiendo espacios de nombres duplicados como he preguntado?

Respuesta

4

Trate de esta manera:

using System; 
using System.Text; 
using System.Xml; 

class Program 
{ 
    private const string ns = "http://tempuri.org/nsA"; 

    static void Main() 
    { 
     var settings = new XmlWriterSettings 
     { 
      Indent = true 
     }; 
     using (var writer = XmlWriter.Create(Console.Out, settings)) 
     { 
      writer.WriteStartElement("Root", ns); 
      writer.WriteStartElement("Child"); 
      writer.WriteAttributeString("attr", "", "val"); 
      writer.WriteEndElement(); 
      writer.WriteEndElement(); 
     } 
    } 
} 
+1

Gracias! Eso funciona, aunque totalmente contrario a la intuición, ya que los atributos también tienen espacios de nombres. – lesscode

+0

O use la respuesta Darin a la pregunta [SO] (http://stackoverflow.com/questions/2500111/how-do-i-add-a-default-namespace-with-no-prefix-using-xmlserializer) – SteveC

+0

Cualquiera encontró una mejor solución? ¡Se supone que esta gestión ns es automática! :(Me encanta especialmente el último ejemplo aquí: http://msdn.microsoft.com/en-us/library/d1a1csew%28v=vs.80%29.aspx – Fowl

Cuestiones relacionadas