2013-02-26 3 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 своим классам.

Что я могу сделать, чтобы Items и Item были правильно десеризованы в объекты?

ответ

1

Я нашел ошибку, я думаю. В вашем классе Row элементы свойств должны быть из элементов типа вместо Item [].

Когда я делаю это изменение, я могу сделать правильную сериализацию и десериализацию.

Вот код Serialize и Deserialize + классы, которые я использовал.

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

Не могли бы вы добавить свой XmlRoot для подписчиков, телефонов и телетекста? Таким образом, я могу сделать несколько лучших тестов.

Я бы также предложил: создать граф объекта и сериализовать его. Таким образом вы можете увидеть, как он становится сериализованным.

Редактировать: здесь XML I десериализован из объекта, который я создал. Поскольку вы видите, что вложенность элементов не в порядке, так что, я думаю, это также будет проблемой во время сериализации. Я буду держать вас в курсе

<?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

Я добавил недостающие корни. Как создать граф объектов? Я никогда не слышал этого термина. –

+0

спасибо ... по графу объектов Я просто имею в виду объект в памяти (var myTable = new Table() и т. Д., Затем сериализуем его) – deblendewim

Смежные вопросы