2012-02-07 79 views
1

我想要實現的東西似乎相當簡單。使用IXmlSerializable定製xml輸出

鑑於類

public class Wrapper<T> { 
    T Data { get; set; } 
    bool Success { get;set; } 
    List<Error> Errors { get; set; } 
} 

我只是想爲裹在<Data></Data>標籤中的數據參數的XML輸出。

IE: 所需的輸出:

<Wrapper> 
    <Data> 
     <Person first="Bob" last="Robertson"/> 
    </Data> 
    <Errors/> 
    <Success>true</Success> 
</Wrapper 

實際輸出:

<Wrapper> 
    <Person first="Bob" last="Robertson"/> 
    <Errors/> 
    <Success>true</Success> 
</Wrapper> 

有一個簡單的實現IXmlSerializable的在那裏我可以獨自離開系列化大部分,只是換了一個會員?

編輯:這是一個WCF服務,所以我不(據我所知),有機會獲得創作的XmlSerializer的。

我最終什麼事做:

public void WriteXml(System.Xml.XmlWriter writer) 
    { 
     writer.WriteElementString("Success", Success.ToString()); 
     writer.WriteStartElement("Errors"); 

     foreach (var error in Errors) 
     { 
      Util.XmlSerialize(error, writer); 
     } 

     writer.WriteStartElement("Data"); 
     Util.XmlSerialize(this.Data, writer); 
     writer.WriteEndElement(); 
    } 

-

public class Util 
{ 
    public static void XmlSerialize<T>(T obj, XmlWriter writer) 
    { 
     var nsSerializer = new XmlSerializerNamespaces(); 
     nsSerializer.Add("", ""); 

     var ser = new XmlSerializer(typeof (T)); 
     ser.Serialize(writer, obj, nsSerializer); 
    } 
} 
+1

那你試試? – onof 2012-02-07 13:13:08

+0

@onof:我曾經嘗試過很多不好的事情,但是感覺自己正在重新實現XmlSerializer(例如,遵守註解等)。我認爲這可能是一種我忽略的簡單方法。我也嘗試重組我的代碼以更好地匹配我期望的格式,但看起來很臭。 – drch 2012-02-07 14:33:43

回答

0

您可以使用XmlOverrides:

var xmlOverrides = new XmlAttributeOverrides(); 
var attributes = new XmlAttributes(); 
attributes.XmlElements 
    .Add(new XmlElementAttribute("Person", typeof (Person))); 
xmlOverrides.Add(typeof(Wrapper<Person>), "Data", attributes); 

var serializer = new XmlSerializer(typeof(Wrapper<ExampleObject>), xmlOverrides); 
+0

這裏是curveball:這是在WCF中,我在服務合約上指定了[XmlSerializerFormat],所以我不負責創建XmlSerializer。 – drch 2012-02-07 15:02:43

0

模式

public class Wrapper<T> 
{ 
    public T Data { get; set; } 
    public bool Success { get; set; } 
} 


public class Person 
{ 
    public string first; 
    public string last; 
} 

XML序列化

 Wrapper<Person> f = new Wrapper<Person>(); 
     f.Data = new Person(); 
     f.Data.first = "Bob"; 
     f.Data.last = "Robertson"; 
     XmlSerializer SerializerObj = new XmlSerializer(typeof(Wrapper<Person>)); 
     TextWriter WriteFileStream = new StreamWriter(@"C:\test.xml"); 
     SerializerObj.Serialize(WriteFileStream, f); 
     WriteFileStream.Close(); 

XML輸出

<?xml version="1.0" encoding="utf-8"?> 
<WrapperOfPerson xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <Data> 
    <first>Bob</first> 
    <last>Robertson</last> 
    </Data> 
    <Success>false</Success> 
</WrapperOfPerson> 
+0

這就是我目前所擁有的。我在尋找什麼是'鮑勃羅伯遜' – drch 2012-02-07 15:12:33

+0

你只能得到其中一個數據標籤或標籤的人。 – Pankaj 2012-02-07 16:58:54