我需要处理某些xml,无法从中反序列化对象列表.以下是xml:
- <catalog>
- <item>
- <id>18338517</id>
- <note label="Name ">Gear xyz</note>
- <note label="Size ">10</note>
- <note label="Source">Store xyz</note>
- <relation weight="100">
- <type>External</type>
- <id>123</id>
- <name>Mcday</name>
- </relation>
- <relation weight="99">
- <type>Internal</type>
- <id>234</id>
- <name>Mcnight</name>
- </relation>
- </item>
- <item> ..... </item></catalog>
以下是我的课
- [XmlRoot("catalog")]
- public class Catalog
- {
- [XmlArray("item")]
- [XmlArrayItem("item",typeof(Item))]
- public Item[] item{ get; set; }
- }
- [XmlRoot("item")]
- public class Item
- {
- [XmlElement("id")]
- public string id { get; set; }
- [XmlArrayItem("note",typeof(Note))]
- public Note[] note { get; set; }
- [XmlArrayItem("relation",typeof(Relation))]
- public Relation[] relation { get; set; }
- }
- [Serializable]
- public class Note
- {
- [XmlAttribute("label")]
- public string label { get; set; }
- [XmlText]
- public string Value { get; set; }
- }
- [Serializable]
- public class Relation
- {
- [XmlAttribute("weight")]
- public string weight { get; set; }
- [XmlText]
- public string Value { get; set; }
- [XmlElement("id")]
- public string id { get; set; }
- [XmlElement("type")]
- public string type { get; set; }
- [XmlElement("name")]
- public string name { get; set; }
- }
最后,要求反序列化
- Catalog catalog = null;
- XmlSerializer mySerializer = new XmlSerializer(typeof(Catalog));
- using (TextReader reader = new StreamReader(@"D:\TEMP\deserialize xml\catalog.xml"))
- {
- catalog = (Catalog)mySerializer.Deserialize(reader);
- }
它不会返回任何错误,只是目录对象中的空项.
解决方法
要像在此处一样使用XmlArray和XmlArrayItem属性:
- [XmlArray("term")]
- [XmlArrayItem("term",typeof(Item))]
- public Item[] item{ get; set; }
您的XML必须实际提供正确的集合元素.所以你的课应该是这样的
- [XmlRoot("catalog")]
- public class Catalog
- {
- [XmlArray("items")] // note that I corrected 'term' to 'items'/'item'
- [XmlArrayItem("item",typeof(Item))]
- public Item[] item{ get; set; }
- }
你的XML应该是这样的
- <catalog>
- <items>
- <item>
- <id>18338517</id>
- ...
请注意< items>对应于[XmlArray(“items”)]的元素,以及子元素< item>对应于[XmlArrayItem(“item”,typeof(Item))].
如果您不想/不能更改XML格式,请使用XmlElement属性而不是XmlArrayItem属性.所以你的最终代码应如下所示:
- [XmlRoot("catalog")]
- public class Catalog
- {
- [XmlElement("item")] // no XmlArray/XmlArrayItem,just XmlElement
- public Item[] Items { get; set; }
- }
- [XmlType("item")]
- public class Item
- {
- [XmlElement("id")]
- public string id { get; set; }
- [XmlElement("note",typeof(Note))] // no XmlArray/XmlArrayItem,just XmlElement
- public Note[] note { get; set; }
- [XmlElement("relation",typeof(Relation))] // no XmlArray/XmlArrayItem,just XmlElement
- public Relation[] relation { get; set; }
- }
- [Serializable]
- public class Note
- {
- [XmlAttribute("label")]
- public string label { get; set; }
- [XmlText]
- public string Value { get; set; }
- }
- [Serializable]
- public class Relation
- {
- [XmlAttribute("weight")]
- public string weight { get; set; }
- [XmlText]
- public string Value { get; set; }
- [XmlElement("id")]
- public string id { get; set; }
- [XmlElement("type")]
- public string type { get; set; }
- [XmlElement("name")]
- public string name { get; set; }
- }