使用相同的属性

时间:2016-09-02 13:51:32

标签: c# xml serialization xsd

我正在使用属性和xml文本反序列化xml文件。问题是这些元素具有相同的属性。所以我总是得到错误,我不能在XmlType中有两个相同的TypeNames。

我的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命名一个元素,则会正确反序列化。

1 个答案:

答案 0 :(得分:1)

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有效,您会看到反序列化的类型直接映射到类型属性。有关正常工作的演示,请参阅this fiddle