2011-01-29 4 views
5

XML 직렬화에 대해 microsoft tutorial을 따르려고하고 있지만 몇 가지 문제가 있습니다!C#의 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 읽기 :이 클래스는 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 파일입니다
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 대신 네임 스페이스 레이블이있는 동일한 XML을 얻으려면 출력을 어떻게 작성해야합니까?

답변

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

2

체크 아웃 XmlSerializerNameSpaces 클래스 : http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlserializernamespaces.aspx. 직렬화 네임 스페이스 선언을 추가 한 후

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