2011-10-28 91 views
2

屬性的內部層次結構,我採用序列XmlSerializer一個對象,我的對象中指定的屬性給予XmlSerializer的指令,像這樣:如何序列化對象的XML,而扁平內

[XmlType("FooElement")] 
public class Foo { 

    [XmlAttribute("Type")] 
    public string fooType; 

    [XmlElement("Name")] 
    public string Name; 

    [XmlElement("Bar")] 
    public Bar BarObject; 
} 

public class Bar { 
    [XmlElement("Message")] 
    public string BarString; 
    [XmlElement("From")] 
    public string FromName; 
} 

當一個對象的類型Foo系列化,會生成以下XML:

<Foo Type="TypeName"> 
    <Name>Name of Foo</Name> 
    <Bar> 
    <Message>5:00 Somewhere</Message> 
    <From>Jane Smith</From> 
    </Bar> 
</Foo> 

我要的是爲富之內的所有數據將被夷爲平地,同樣的水平,像這樣:

<Foo Type="TypeName"> 
    <Name>Name of Foo</Name> 
    <Message>5:00 Somewhere</Message> 
    <From>Jane Smith</From> 
</Foo> 

Foo和Bar保持獨立的班級對我的需求非常重要。除了合併類之外,當將序列化爲XML時,如何將Foo的元素展平爲單個級別?如果可以通過使用[Property]標籤來完成,那將是最好的。我願意切換我的XML序列化方法。

編輯:我已切換到XmlWriter班。這將使我可以在我要查找的層次結構中編寫XML元素。使用此處生成的XML的程序比C#XML工具簡單得多。更簡單的解析器在使用XmlSerializer生成的XML時遇到了困難。

回答

4

這應該這樣做

void Main() 
{ 
    var foo = new Foo 
    { 
     Name = "name", 
     fooType = "type", 
     BarObject = new Bar { BarString = "bar"} 
    }; 

    var s = new XmlSerializer(typeof(Foo)); 
    using (var writer = new StringWriter()) 
    { 
     s.Serialize(writer, foo); 
     writer.ToString().Dump(); 
    } 
} 


public class Foo { 

    [XmlAttribute("Type")] 
    public string fooType; 

    [XmlElement("Name")] 
    public string Name; 

    [XmlElement("Message")] 
    public Bar BarObject; 
} 

public class Bar { 

    [XmlText] 
    public string BarString; 
} 

輸出是:

<?xml version="1.0" encoding="utf-16"?> 
<Foo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" Type="type"> 
    <Name>name</Name> 
    <Message>bar</Message> 
</Foo> 
+0

這看起來不錯。一個問題:可以縮放工作,如果Bar有多個元素(Message,Date等),Bar內的每個元素都出現在XML中的Foo元素中? – ford

+0

@ford如果你添加更多的屬性/字段到'Bar'類?當然,爲什麼不呢。只需添加並標記爲'[XmlElement]'。否則我不確定你的意思。 –

+0

感謝您的澄清請求。我編輯了我的問題。 – ford

2

我不知道如何在不添加屬性的情況下將Foo映射到Bar的相應屬性。例如:

[XmlType("FooElement")] 
public class Foo { 

    [XmlAttribute("Type")] 
    public string fooType; 

    [XmlElement("Name")] 
    public string Name; 

    [XmlIgnore()] 
    public Bar BarObject; 

    [XmlElement("Message")] 
    public string BarMessage 
    { 
     get { 
      return this.Bar.BarString; 
     } 
     set { 
      this.Bar.BarString = value; 
     } 
} 

public class Bar { 
    public string BarString; 
}