2013-02-26 107 views
1

我有這樣的XML結構(excert從更大的文件 - 只有這部分對問題)XML反序列化跳過元素

<Table> 
    <Row id="1"> 
     <Heading>sgjsfgjsgfh443q572q356</Heading> 
     <Items> 
      <Item car="motor1" id="1"> 
       <BodyText color="red">130*</BodyText> 
       <Subscript>3</Subscript> 
      </Item> 
     </Items> 
    </Row> 
</Table> 

,並嘗試與XmlSerializer反序列化是這種模式(也excert匹配的零件XML):

[XmlRoot("Table")] 
public partial class Table 
{ 
    [XmlElement("Row")] 
    public Row[] Row { get; set; } 
} 

[XmlRoot("Row")] 
public partial class Row 
{ 
    [XmlElement("Heading")] 
    public string Heading { get; set; } 

    [XmlElement("Items")] 
    public Item[] Items { get; set; } 

    [XmlElement("BodyText")] 
    public BodyText BodyText { get; set; } 

    [XmlAttribute("id")] 
    public string id { get; set; } 
} 

[XmlRoot("Items")] 
public partial class Items 
{ 
    [XmlElement("Item")] 
    public Item[] Item { get; set; } 
} 

[XmlRoot("Item")] 
public partial class Item 
{ 
    [XmlElement("BodyText")] 
    public BodyText BodyText { get; set; } 

    [XmlElement("PhoneNumber")] 
    public PhoneNr[] PhoneNr { get; set; } 

    [XmlElement("Subscript")] 
    public Subscript[] Subscript { get; set; } 

    [XmlAttribute("car")] 
    public string car { get; set; } 

    [XmlAttribute("id")] 
    public string id { get; set; } 
} 

[XmlRoot("BodyText")] 
public partial class BodyText 
{ 
    [XmlAttribute("color")] 
    public string color { get; set; } 

    [XmlAttribute("fonttype")] 
    public string fonttype { get; set; } 

    [XmlAttribute("fontsize")] 
    public string fontsize { get; set; } 

    [XmlAttribute("fontweight")] 
    public string fontweight { get; set; } 

    [XmlText] 
    public string Value { get; set; } 
} 

[XmlRoot("Subscript")] 
public partial class Subscript 
{ 
    [XmlAttribute("for")] 
    public string @for { get; set; } 

    [XmlText] 
    public string Value { get; set; } 
} 

[XmlRoot("PhoneNr")] 
public partial class PhoneNr 
{ 
    [XmlElement("Display")] 
    public string Display { get; set; } 

    [XmlElement("Number")] 
    public string Number { get; set; } 

    [XmlAttribute("id")] 
    public string id { get; set; } 
} 

Table類產生的對象包含單個元件,這是很好的,但:內部元素均爲空。看來序列化程序不能匹配Items到他們的類。

我該怎麼做,所以ItemsItem被正確反序列化成對象?

回答

1

我發現了我認爲的錯誤。 在你的類行中,屬性項應該是類型項而不是Item []。

當我做這個改變時,我可以做適當的序列化和反序列化。

這裏是序列化和反序列化代碼+我使用的類。

private void button1_Click(object sender, EventArgs e) 
{ 
    //Serialize 
    //var x = File.ReadAllText(@"C:\TableInfo.xml"); 
    //var stringReader = new StringReader(x); 
    //var deserializer = new XmlSerializer(typeof(Table)); 
    //var myTable = (Table)deserializer.Deserialize(stringReader); 

    //Deserialize 
    var myTable2 = new Table(); 
    myTable2.Row = new Row[1]; 
    myTable2.Row[0] = new Row(); 
    myTable2.Row[0].id = "myId"; 
    myTable2.Row[0].Heading = "myHeading"; 
    myTable2.Row[0].Items = new Items(); 
    myTable2.Row[0].Items.Item = new Item[1]; 
    myTable2.Row[0].Items.Item[0] = new Item(); 
    myTable2.Row[0].Items.Item[0].BodyText = new BodyText() { color = "Red" }; 
    myTable2.Row[0].Items.Item[0].BodyText.Value = "135"; 
    myTable2.Row[0].Items.Item[0].car = "myCar"; 
    myTable2.Row[0].Items.Item[0].id = "myId"; 
    myTable2.Row[0].Items.Item[0].Subscript = new Subscript[1]; 
    myTable2.Row[0].Items.Item[0].Subscript[0] = new Subscript(); 
    myTable2.Row[0].Items.Item[0].Subscript[0].Value = "3"; 

    XmlSerializer serializer = new XmlSerializer(typeof(Table)); 
    TextWriter textWriter = new StreamWriter(@"C:\TableInfo.xml"); 
    serializer.Serialize(textWriter, myTable2); 
    textWriter.Close(); 
} 

[XmlRoot("Table")] 
public partial class Table 
{ 
    [XmlElement("Row")] 
    public Row[] Row { get; set; } 
} 

[XmlRoot("Row")] 
public partial class Row 
{ 
    [XmlElement("Heading")] 
    public string Heading { get; set; } 

    [XmlElement("Items")] 
    public Items Items { get; set; } 

    [XmlElement("BodyText")] 
    public BodyText BodyText { get; set; } 

    [XmlAttribute("id")] 
    public string id { get; set; } 
} 

[XmlRoot("Items")] 
public partial class Items 
{ 
    [XmlElement("Item")] 
    public Item[] Item { get; set; } 
} 

[XmlRoot("Item")] 
public partial class Item 
{ 
    [XmlElement("BodyText")] 
    public BodyText BodyText { get; set; } 

    [XmlElement("PhoneNumber")] 
    public PhoneNr[] PhoneNr { get; set; } 

    [XmlElement("Subscript")] 
    public Subscript[] Subscript { get; set; } 

    [XmlAttribute("car")] 
    public string car { get; set; } 

    [XmlAttribute("id")] 
    public string id { get; set; } 
} 

[XmlRoot("BodyText")] 
public partial class BodyText 
{ 
    [XmlAttribute("color")] 
    public string color { get; set; } 

    [XmlAttribute("fonttype")] 
    public string fonttype { get; set; } 

    [XmlAttribute("fontsize")] 
    public string fontsize { get; set; } 

    [XmlAttribute("fontweight")] 
    public string fontweight { get; set; } 

    [XmlText] 
    public string Value { get; set; } 
} 

[XmlRoot("Subscript")] 
public partial class Subscript 
{ 
    [XmlAttribute("for")] 
    public string @for { get; set; } 

    [XmlText] 
    public string Value { get; set; } 
} 

[XmlRoot("PhoneNr")] 
public partial class PhoneNr 
{ 
    [XmlElement("Display")] 
    public string Display { get; set; } 

    [XmlElement("Number")] 
    public string Number { get; set; } 

    [XmlAttribute("id")] 
    public string id { get; set; } 
} 
1

你能否爲下標,PhoneNr和BodyText添加你的XmlRoot?這樣我可以做一些更好的測試。

我還建議:創建對象圖並對其進行序列化。這樣你可以看到它是如何被序列化的。

編輯:這裏是我從我創建的對象反序列化的XML。正如你所看到的物品嵌套不好,所以我猜這也將是序列化時的問題。我會及時通知您

<?xml version="1.0" encoding="utf-8"?> 
<Table xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <Row> 
    <Heading>myHeading</Heading> 
    <Items car="myCar" id="myId"> 
     <BodyText color="Red">135</BodyText> 
     <Subscript>3</Subscript> 
    </Items> 
    <Items car="myCar" id="myId"> 
     <BodyText color="Red">135</BodyText> 
     <Subscript>3</Subscript> 
    </Items> 
    </Row> 
</Table> 
+0

我加了缺失的根。我如何創建一個對象圖?我從來沒有聽說過這個詞。 – 2013-02-26 16:40:18

+0

謝謝...通過對象圖我只是指內存中的對象(var myTable = new Table()等等,然後序列化它) – deblendewim 2013-02-26 16:44:06