反序列化具有相同属性的xml元素
本文关键字:xml 元素 属性 反序列化 | 更新日期: 2023-09-27 18:05:26
我正在反序列化一个带有属性和xml文本的xml文件。问题是这些元素具有相同的属性。所以我总是得到错误,我不能有两个相同的typename在XmlType。
我的xml:
<group_id xsi:type="xsd:int">1</group_id>
<name xsi:type="xsd:int">myNameView</name>
和我的c#:
[XmlType(AnonymousType = true, Namespace = "http://www.w3.org/2001/XMLSchema", TypeName = "int")]
[XmlRoot(ElementName = "group_id")]
public class Group_id
{
[XmlAttribute(AttributeName = "type", Namespace = "http://www.w3.org/2001/XMLSchema-instance")]
public string Type { get; set; }
[XmlText]
public string Text { get; set; }
}
[XmlType(AnonymousType = true, Namespace = "http://www.w3.org/2001/XMLSchema", TypeName = "int")]
[XmlRoot(ElementName = "name")]
public class Name
{
[XmlAttribute(AttributeName = "type", Namespace = "http://www.w3.org/2001/XMLSchema-instance")]
public string Type { get; set; }
[XmlText]
public string Text { get; set; }
}
问题是XmlType属性中的TypeName。如果我只用TypeName命名一个元素,它将被正确地反序列化。
XmlSerializer
根据xsi:type
属性为您处理类型。如果你试图自己处理这些问题,你会给它带来一些痛苦。
如果将元素声明为object
,则序列化器将使用类型属性来确定如何反序列化值。注意,由于您的示例只是一个片段,我假设根元素称为root
:
[XmlRoot("root")]
public class Root
{
[XmlElement("group_id")]
public object GroupId { get; set; }
[XmlElement("name")]
public object Name { get; set; }
}
现在,当你反序列化你的例子,你实际上会得到一个异常(因为myNameView
不是一个整数)。您可以通过将类型更改为xsd:string
或将值更改为有效整数来修复。
如果XML有效,您将看到反序列化的类型直接映射到类型属性。