2011-01-29 12 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; 
     } 
    } 

この関数は、 'OrderedItem' クラスにXMLをお読みください。

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> 

ご覧のとおり、名前空間が拡張されています。 uriではなくnamespaceラベルを持つ同じXMLを得るために、出力をどのように書くべきですか?

答えて

0

あなたがオブジェクトをシリアル化するオーバーロードされたメソッドに見てしたいことがありますが、次のコード行でXmlSerializerNamespacesを定義することができ、そこに述べたように

default serialization

defining namespaces for serialization

// 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に逆シリアル化する)。このトピックでは、ここにも議論されてきた

、詳細についてはここを見て:http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlserializernamespaces.aspxProper way to implement IXmlSerializable

2

XmlSerializerNameSpacesクラスをチェックしてください。シリアライズ名前空間宣言を追加し

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

    ... 
} 

そして:あなたはXmlNamespaceDeclarationsAttribute付いたタイプXmlSerializerNamespacesのメンバーを、追加する必要が

XmlSerializer s = new XmlSerializer(typeof(OrderedItem)); 
    XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); 
    ns.Add("books", "http://www.cpandl.com"); 
    ns.Add("money", "http://www.cohowinery.com");  
    s.Serialize(new StreamWriter("a_output.xml"), i, ns); 
1

このサンプルコードでは、トリックを行う必要があります。

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