2017-12-10 10 views
1

あまり一般的でないXML構造の逆シリアル化に問題があります。 残念ながら私はソースサイトに影響しません。不明な要素名のXML配列をシリアライズ

XMLには、Device要素を複数持つことができるBusという名前のルートがあります。 Device要素は複数の値を持つことができます。 (長いのでとても良い)。

<Bus protocol="Meterbus" baud="2400"> 
    <Device Name="DHZ-1" PrimaryAddr="62"> 
     <Energie _="value" Name="Energie" size="13"/> 
     <Spannung _="value" Name="Spannung" size="13"/> 
     <Strom _="value" Name="Strom" size="13"/> 
     <Leistung _="value" Name="Leistung" size="13"/> 
     <Seriennummer _="value" Name="Seriennummer" size="13"/> 
     <... _="..." Name="..." size=".."/> 
    </Device> 
</Bus> 

問題は、値に完全な動的要素名がありますが、同じパラメータです。

<somename _="value" Name="somename" size="13"/>のようなものです。

しかし、それらはすべて、名前にかかわらずValueタイプとしてシリアル化する必要があります。このような

何か:

public class Device 
{ 
    [XmlAttribute("Name")] 
    public String Name 
    { 
     get; 
     set; 
    } 

    [XmlAttribute("PrimaryAddr")] 
    public String PrimaryAddr 
    { 
     get; 
     set; 
    } 

    [???] 
    public Array<Value> Values 
    { 
     get; 
     set; 
    } 
} 

どのように私は、シリアライザにこれを説明することができます

public class Value 
{ 
    [XmlAttribute("_")] 
    public String _ 
    { 
     get; 
     set; 
    } 

    [XmlAttribute("Name")] 
    public String Name 
    { 
     get; 
     set; 
    } 

    [XmlAttribute("size")] 
    public String Size 
    { 
     get; 
     set; 
    } 
} 

Deviceクラスは次のようになりますか?

答えて

1

XmlSerializerクラスは、定義されていない要素または未知の要素が解析されるたびに呼び出されるUnknownElementイベントを実装します。あなたがこのイベントにハンドラを登録し、手動で未定義/未知の要素をデシリアライズすることができます

private void Serializer_UnknownElement(Object sender, XmlElementEventArgs e) 
{ 
    var device = e.ObjectBeingDeserialized as Device; 

    if (device != null) 
    { 
     XmlElement element = e.Element; 

     using (StringReader reader = new StringReader(element.OuterXml)) 
     { 
      XmlSerializer valueSerializer = new XmlSerializer(typeof(Value), (new XmlRootAttribute(element.Name))); 

      Value value = (Value)valueSerializer.Deserialize(reader); 
      value.Name = element.Name; // implement it so you can rebuild the tag back 

      device.Values.Add(value); 
     } 
    } 
} 

公式MSDNのドキュメントhere

XmlSerializer serializer = new XmlSerializer(typeof(Bus)); 
serializer.UnknownElement += new XmlElementEventHandler(Serializer_UnknownElement); 

Aは一例を働きました。

関連する問題