反序列化具有相同属性的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命名一个元素,它将被正确地反序列化。

反序列化具有相同属性的xml元素

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有效,您将看到反序列化的类型直接映射到类型属性。