2016-09-02 7 views
1

属性とxmlテキストを使用してxmlファイルを逆シリアル化しています。問題は、それらの要素が同じ属性を持つことです。だから、私は常にXmlTypeに2つの同一のTypeNamesを持たないというエラーが発生しています。同じ属性を持つxml要素を逆シリアル化する

私の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を持つ要素の名前を1つだけ指定すると、正しくデシリアライズされます。

答えて

1

XmlSerializerxsi:type属性に基づいて、ハンドルタイプを指定します。これらを自分で処理しようとすると、悲しみを引き起こしています。

要素をobjectと宣言すると、シリアライザは型属性を使用して値を逆シリアル化する方法を決定します。

[XmlRoot("root")] 
public class Root 
{ 
    [XmlElement("group_id")] 
    public object GroupId { get; set; } 

    [XmlElement("name")] 
    public object Name { get; set; } 
} 

あなたはあなたの例をデシリアライズするとき(myNameViewが整数でないと)さて、あなたが実際に例外を取得したい:あなたの例は単なる断片であるとして、私はルート要素がrootと呼ばれると仮定しました注意してください。タイプをxsd:stringに変更するか、値を有効な整数に変更することで修正できます。

XMLが有効だった場合、非直列化された型が型属性に直接マップされていることがわかります。デモの作業については、this fiddleを参照してください。

関連する問題