1

私はこのXML構造を持っています(より大きなファイルからのexcert-この部分だけが問題を引き起こします)

<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をこのモデルに逆シリアル化してみてください(XMLに一致する部分のexcertも):

[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単一のRow要素が含まれていますが、これは問題ありませんが、内部の要素Rowはすべてnullです。Itemsシリアライザーがクラスに一致しないようです。

何ができるので、ItemsItemはオブジェクトに正しく逆シリアル化されますか?

4

2 に答える 2

1

下付き文字、PhoneNr、BodyTextのXmlRootを追加していただけますか?このようにして、私はいくつかのより良いテストを行うことができます。

また、次のことをお勧めします。オブジェクトグラフを作成し、シリアル化します。このようにして、シリアル化される方法を確認できます。

編集:これは私が作成したオブジェクトから逆シリアル化したXMLです。ご覧のとおり、アイテムのネストはOKではないので、シリアル化中にも問題になると思います。私はあなたに知らせ続けます

<?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>
于 2013-02-26T16:34:23.183 に答える
1

私が思う間違いを見つけました。クラスRowでは、プロパティItemsはItem[]ではなくTypeItemsである必要があります。

この変更を行うと、適切なシリアル化と逆シリアル化を実行できます。

これがシリアル化と逆シリアル化のコード+私が使用したクラスです。

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; }
}
于 2013-02-26T17:31:02.600 に答える