2016-03-21 31 views
0

私が構築し、そのような.NETでこのよう/シリアライズXMLをデシリアライズするためにクラス構造を構成する方法を考え出すのトラブルを抱えている:シリアル化XML

<OuterElem> 
    <InnerElem> 
     <C1>...</C1> 
    </InnerElem> 
</OuterElem> 

いくつかの注意:

  • C1は複合型です。
  • C2、C3などの異なる複合タイプもあります。
  • 複数のCx要素が同時に存在することがあります。
  • OuterElemとInnerElemは、Cx要素とは異なる名前空間に由来します。
  • 実行時(実際にコンパイル時)に、可能なCx要素の完全なセットは現在のユースケースでよく知られていますが、ラッピング要素は汎用ソリューションの一部ですので、Cx要素に依存しないことが望ましいです。

これは私がこれまで持っているものです。

[XmlRoot(Namespace = "urn:outer-ns")] 
public class OuterElem 
{ 
    public object[] InnerElem { get; set; } 
} 

[XmlRoot(ElementName = "C1", Namespace = "urn:ns1")] 
public class C1 { } 

[XmlRoot(ElementName = "C2", Namespace = "urn:ns1")] 
public class C2 { } 

しかし、これは私が欲しいもの与えるものではありません。

var xs = new XmlSerializer (typeof(OuterElem), 
          new [] {typeof(C1), typeof(C2)}); 
var s = new StringWriter(); 
xs.Serialize (s, outerElemInstance); 

利回りXMLのように:でシリアル化

<?xml version="1.0" encoding="utf-16"?> 
<OuterElem> 
    <Body> 
     <anyType xmlns:q1="urn:ns1" xsi:type="q1:C1"> 

どのように私はそれがこのanyTypeするのではなく、要素名C1を使用することができますか?このユースケースについては

答えて

0

、通常InnerElemは、以下のようのXmlElement属性で修飾する必要があります。

public class OuterElem 
{ 
    [XmlElement(typeof(C1))] 
    [XmlElement(typeof(C2))] 
    public object[] InnerElem { get; set; } 
} 

しかし、あなたはどのてはならない汎用的な解決策に取り組んでいることを述べてきたようにC1/C2に依存...種類、一つの可能​​な解決策がXmlAttributeOverrides

XmlAttributeOverrides overrides = new XmlAttributeOverrides(); 
XmlAttributes attribs = new XmlAttributes(); 
attribs.XmlIgnore = false; 
attribs.XmlElements.Add(new XmlElementAttribute(typeof(C1))); 
attribs.XmlElements.Add(new XmlElementAttribute(typeof(C2))); 
overrides.Add(typeof(OuterElem), "InnerElem", attribs); 

var xs = new XmlSerializer(typeof(OuterElem), overrides, new [] {typeof(C1), typeof(C2)}, null, null); 
var s = new StringWriter(); 
xs.Serialize(s, outerElemInstance); 
+0

のおかげでこれらの属性を追加することで、これは私がやりたいようです。最終的に、XmlAttributeOverridesクラスが何であるかを知ることができました。 –