2011-01-29 18 views
5

Sto provando a seguire uno microsoft tutorial sulla serializzazione XML, ma ottengo qualche problema !!Serializzazione Xml in C#

Si tratta di file XML, utilizzato come input:

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

Questa è la classe di legare l'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; 
     } 
    } 

Questa funzione leggere il codice XML in classe '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); 

Questo è l'XML dopo aver letto e riscritto:

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

Come si può vedere, lo spazio dei nomi è espanso. Come dovrei scrivere l'output, per ottenere lo stesso XML con l'etichetta namespace, invece di uri?

risposta

0

Si consiglia di avere uno sguardo sul metodo di overload per la serializzazione di un oggetto:

default serialization

defining namespaces for serialization

Come accennato lì, è possibile definire XmlSerializerNamespaces con le seguenti righe di codice:

// 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"); 

Spero che questo aiuti.

0

Per serializzare l'oggetto nel formato sopra riportato, è necessario implementare l'interfaccia IXmlSerializable sul proprio oggetto (MSDN Documentation). Questa interfaccia ti consente di implementare metodi che ti daranno il controllo completo sul risultato serializzato della tua classe (e anche di deserializzare l'xml sul tuo oggetto).

Questo argomento è stato discusso anche qui, guarda qui per maggiori informazioni: Proper way to implement IXmlSerializable

1

È necessario aggiungere un membro di tipo XmlSerializerNamespaces, contrassegnati con un XmlNamespaceDeclarationsAttribute:

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

    ... 
} 

E poi aggiungere le dichiarazioni di spazio dei nomi durante la serializzazione:

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)); 
... 
Problemi correlati