2011-01-29 91 views
5

我正在尝试遵循关于XML序列化的microsoft tutorial,但我遇到了一些问题!C#中的Xml序列化#

这是XML文件,用作输入:

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

这是类到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; 
     } 
    } 

该函数读取XML入 '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); 

这是在读取和改写之后的XML:

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

正如您所看到的,命名空间已展开。我应该如何编写输出,以获得与名称空间标签相同的XML而不是uri?

回答

0

您可能要对重载方法看看序列化对象:

default serialization

defining namespaces for serialization

由于没有提到的,你可以用下面的代码行定义XmlSerializerNamespaces

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

希望有所帮助。

0

为了将您的对象序列化为上面提供的格式,您将不得不在对象上实现IXmlSerializable接口(MSDN Documentation)。这个接口允许你实现一些方法,让你可以完全控制你的类的序列化结果(还可以将xml反序列化回你的对象)。

这个主题已经在这里讨论为好,看看这里的更多信息:Proper way to implement IXmlSerializable

1

您需要添加XmlSerializerNamespaces类型的成员,标有XmlNamespaceDeclarationsAttribute

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

    ... 
} 

,然后添加序列化时,命名空间声明:

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