2011-10-26 20 views
5

Estoy tratando de crear un documento XML con varios espacios de nombres utilizando System.Xml.Xmlwriter en C# y estoy recibiendo el siguiente error en la compilación:C# XML - declaración de espacio múltiple con el escritor XML

El prefijo '' no se puede redefinir de '' a 'http://www.acme.com/BOF' dentro de la misma etiqueta de elemento de inicio.

La totalidad de mi código es el siguiente:

 XmlWriterSettings settings = new XmlWriterSettings { Encoding = Encoding.UTF8, Indent = true }; 

     XmlWriter writer = XmlWriter.Create("C:\\ACME\\xml.xml", settings); 

     writer.WriteStartDocument(); 

     writer.WriteStartElement("BOF"); 
     writer.WriteAttributeString("xmlns", null, null, "http://www.acme.com/BOF"); //This is where I get my error 
     writer.WriteAttributeString("xmlns", "xsi", null, "http://www.w3.org/2001/XMLSchema-instance"); 
     writer.WriteAttributeString("fileName", null, null, "test.xml"); 
     writer.WriteAttributeString("date", null, null, "2011-10-25"); 
     writer.WriteAttributeString("origin", null, null, "MYORIGIN"); 
     writer.WriteAttributeString("ref", null, null, "XX_88888"); 
     writer.WriteEndElement(); 

     writer.WriteStartElement("CustomerNo"); 
     writer.WriteString("12345"); 
     writer.WriteEndElement(); 

     writer.WriteEndDocument(); 

     writer.Flush(); 
     writer.Close(); 

¿Qué estoy haciendo mal?

Gracias

John

Respuesta

7
writer.WriteStartElement("BOF"); // write element name BOF, no prefix, namespace "" 
writer.WriteAttributeString("xmlns", null, null, "http://www.acme.com/BOF"); //Set namespace for no prefix to "http://www.acme.com/BOF". 

La segunda línea no tiene sentido, porque va a asignar el valor por defecto (sin prefijo) de espacio de nombres a algo distinto de lo que es, en el mismo lugar, ya que es eso.

sustituir las dos líneas con writer.WriteStartElement("BOF", "http://www.acme.com/BOF")

3

debe pasar el espacio de nombres por defecto para el método WriteStartElement.

0
writer.WriteAttributeString("xmlns", "xsi", null, "http://www.w3.org/2001/XMLSchema-instance"); 

debe ser escrita como

writer.WriteAttributeString("xsi", "http://www.w3.org/2000/xmlns/", "http://www.w3.org/2001/XMLSchema-instance"); 

En ese caso, el prefijo xsi se ha registrado en la tabla de nombres XML. El uso posterior de http://www.w3.org/2001/XMLSchema-instance para el parámetro ns en un método de XmlWriter anteponerá el prefijo de espacio de nombres XML de xsi.

URI del espacio de nombres XML xsi también está disponible en .NET por constante System.Xml.Schema.XmlSchema.InstanceNamespace.

Cuestiones relacionadas