0

別のプログラムにインポートするためのXML出力ファイルを作成しようとしています。提供されたXMLファイルの例は次のようになります。

    <SalesOrder>
  <OrderHeader>
    <BillTo>
      <EntityID>1234</EntityID>
    </BillTo>
  </OrderHeader>
  <LineItemList>
    <OrderLineComment>
      <LineItemID>1</LineItemID>
    </OrderLineComment>
    <LineItem>
      ...
    </LineItem>
    <LineItem>
      ...
    </LineItem>
    <LineItem>
      ...
    </LineItem>
    ...
  </LineItemList>
</SalesOrder>

この部分を除いて、XmlSerializerを使用してこのタイプのファイルを出力できるC#プロジェクトがあります。

  <LineItemList>
    <OrderLineComment>
      <LineItemID>1</LineItemID>
    </OrderLineComment>

LineItemListセクションは単なるLineItemのリストですが、LineItemListの先頭には、この異なる要素OrderLineCommentが追加されています。

これをLineItemsの配列として表すと、OrderLineCommentがないことを除いて、同じように見えます。これを、OrderLineCommentとLineItemsの配列を含む新しいオブジェクトLineItemListとして表すと、次のようになります。

  <LineItemList>
    <OrderLineComment>
      <LineItemID>1</LineItemID>
    </OrderLineComment>
    <LineItems>
      <LineItem>
    ...
      </LineItem>
      ...
    </LineItems>

すべてのLineItemをタグでラップすることを除いて、これは私が望むものを持っていますが<LineItems>、これも私が望むものではありません。

だから私が疑問に思っているのは:

  1. XmlSerializerを介してこれを行う方法はありますか?もしそうなら、どのように?
  2. ない場合、XmlSerializer以外のものを使用するようにコードを書き直す必要がある場合、これを行うための最良の方法とその理由は何ですか?

前もって感謝します。

4

2 に答える 2

2

OrderLineCommentを作成し、共通の基本クラスからLineItem派生させることができます。

public abstract class LineItemBase
{
    ...
}

public class LineItem : LineItemBase
{
    ...
}

public class OrderLineComment : LineItemBase
{
    ...
}

次に、プロパティをオブジェクトLineItemListのコレクションとして宣言し、属性を使用して、コレクションに含めることができるタイプを指定します。LineItemBaseXmlArrayItem

[XmlArrayItem(typeof(LineItem))]
[XmlArrayItem(typeof(OrderLineComment))]
public List<LineItemBase> LineItemList { get; set; }

これはあなたが望むものを達成するはずです

于 2010-08-25T15:54:13.387 に答える
1

タイプにはいつでもIXmlSerializableインターフェースを実装できます。あらゆる複雑さのシリアル化を可能にし、XmlSerializerで動作します。

編集:

これは、標準の属性で実現したい場合に生成されるコードの例です。xmlからxsdを作成し、XSD.exeを使用してコードを生成しました。

[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.3038")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
[System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)]
public partial class SalesOrder {

    private OrderHeader orderHeaderField;

    private LineItemList lineItemListField;

    /// <remarks/>
    public OrderHeader OrderHeader {
        get {
            return this.orderHeaderField;
        }
        set {
            this.orderHeaderField = value;
        }
    }

    /// <remarks/>
    public LineItemList LineItemList {
        get {
            return this.lineItemListField;
        }
        set {
            this.lineItemListField = value;
        }
    }
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.3038")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
[System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)]
public partial class OrderHeader {

    private BillTo billToField;

    /// <remarks/>
    public BillTo BillTo {
        get {
            return this.billToField;
        }
        set {
            this.billToField = value;
        }
    }
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.3038")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
[System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)]
public partial class BillTo {

    private short entityIDField;

    /// <remarks/>
    public short EntityID {
        get {
            return this.entityIDField;
        }
        set {
            this.entityIDField = value;
        }
    }
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.3038")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
[System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)]
public partial class LineItemList {

    private OrderLineComment orderLineCommentField;

    private string[] lineItemField;

    /// <remarks/>
    public OrderLineComment OrderLineComment {
        get {
            return this.orderLineCommentField;
        }
        set {
            this.orderLineCommentField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("LineItem")]
    public string[] LineItem {
        get {
            return this.lineItemField;
        }
        set {
            this.lineItemField = value;
        }
    }
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.3038")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
[System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)]
public partial class OrderLineComment {

    private sbyte lineItemIDField;

    /// <remarks/>
    public sbyte LineItemID {
        get {
            return this.lineItemIDField;
        }
        set {
            this.lineItemIDField = value;
        }
    }
}
于 2010-08-25T15:12:17.647 に答える