2011-01-29 20 views
5

Estoy tratando de seguir un microsoft tutorial sobre la serialización de XML, pero tengo algunos problemas.Xml Serialización en C#

Este es el archivo XML, que se utiliza como entrada:

<?xml version="1.0" encoding="utf-8"?> 
<Books xmlns:books="http://www.cpandl.com" xmlns:money="http://www.cohowinery.com"> 
    <money:Book> 
    <books:TITLE>A Book Title</books:TITLE> 
    <money:PRICE books:currency="US Dollar"> 
     <money:price>9.95</money:price> 
    </money:PRICE> 
    </money:Book> 
</Books> 

Ésta es la clase para enlazar el XML:

public class OrderedItem 
{ 
     [XmlElement(Namespace = "http://www.cpandl.com")] 
     public string ItemName; 
     [XmlElement(Namespace = "http://www.cpandl.com")] 
     public string Description; 
     [XmlElement(Namespace = "http://www.cohowinery.com")] 
     public decimal UnitPrice; 
     [XmlElement(Namespace = "http://www.cpandl.com")] 
     public int Quantity; 
     [XmlElement(Namespace = "http://www.cohowinery.com")] 
     public decimal LineTotal; 
     // A custom method used to calculate price per item. 
     public void Calculate() 
     { 
      LineTotal = UnitPrice * Quantity; 
     } 
    } 

Esta función lee el XML en clase 'OrderedItem':

Console.WriteLine("Reading with Stream"); 

// Create an instance of the XmlSerializer. 
var serializer = new XmlSerializer(typeof(OrderedItem)); 

// Reading the XML document requires a FileStream. 
Stream reader = new FileStream(filename, FileMode.Open); 

// Declare an object variable of the type to be deserialized. 
// Call the Deserialize method to restore the object's state. 
var i = (OrderedItem)serializer.Deserialize(reader); 

Console.SetOut(new StreamWriter("a_output.xml")); 
serializer.Serialize(Console.Out, i); 

Este es el XML después de leer y reescribir:

<?xml version="1.0" encoding="utf-8"?> 
<OrderedItem xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <ItemName xmlns="http://www.cpandl.com">Widget</ItemName> 
    <Description xmlns="http://www.cpandl.com">Regular Widget</Description> 
    <UnitPrice xmlns="http://www.cohowinery.com">2.3</UnitPrice> 
    <Quantity xmlns="http://www.cpandl.com">10</Quantity> 
    <LineTotal xmlns="http://www.cohowinery.com">23</LineTotal> 
</OrderedItem> 

Como puede ver, el espacio de nombres se expande. ¿Cómo debo escribir el resultado, para obtener el mismo XML con la etiqueta de espacio de nombres, en lugar de uri?

Respuesta

0

Es posible que desee echar un vistazo en el método sobrecargado para serializar un objeto:

default serialization

defining namespaces for serialization

Como se menciona allí, se puede definir XmlSerializerNamespaces con las siguientes líneas de código:

// Create an XmlSerializerNamespaces object. 
    XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); 

    // Add two prefix-namespace pairs. 
    ns.Add("inventory", "http://www.cpandl.com"); 
    ns.Add("money", "http://www.cohowinery.com"); 

Espero que ayude.

0

Para serializar su objeto al formato proporcionado anteriormente, tendrá que implementar la interfaz IXmlSerializable en su objeto (MSDN Documentation). Esta interfaz le permite implementar métodos que le darán control total sobre el resultado serializado de su clase (y también deserializar el xml de regreso a su objeto).

Este tema ha sido discutido aquí también, mira aquí para más información: Proper way to implement IXmlSerializable

1

Es necesario añadir un miembro de tipo XmlSerializerNamespaces, marcado con un XmlNamespaceDeclarationsAttribute:

public class OrderedItem 
{ 
    [XmlNamespaceDeclarations] 
    public XmlSerializerNamespaces xmlns = new XmlSerializerNamespaces(); 

    ... 
} 

Y a continuación, añadir las declaraciones de espacio de nombres Cuando seria:

OrderedItem item = new OrderedItem(); 
item.xmlns.Add("books", "http://www.cpandl.com"); 
item.xmlns.Add("money", "http://www.cohowinery.com"); 
XmlSerializer serializer = new XmlSerializer(typeof(OrderedItem)); 
...