将 XML 反序列化为对象时缺少子节点
本文关键字:子节点 对象 XML 反序列化 | 更新日期: 2023-09-27 17:55:55
我需要处理某些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>
...
请注意对应于 [XmlArray("items")]
的 <items>
元素和对应于 [XmlArrayItem("item", typeof(Item))]
的子元素<item>
。
如果您不想/无法更改 XML 格式,则 use 可以简单地使用 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; }
}
您的属性是错误的:
public class Catalog
{
[XmlArray("term")]
[XmlArrayItem("term", typeof(Item))]
试试这个:
public class Catalog
{
[XmlArray("items")]
[XmlArrayItem("item", typeof(Item))]
编辑:为了进一步开发项目,应考虑创建XML架构并使用XSD生成代码.exe例如,请参阅此问题:反序列化xml-to-objects-in-c-sharp
编辑2:查看MSDN,XmlArrayAttribute构造函数定义为:
public XmlArrayAttribute(
string elementName
)
其中参数记录为:
元素名称 类型:系统字符串
The name of the XML element that the XmlSerializer generates.