2017-07-12 3 views
0

xmlファイルをc#クラスにデシリアライズしようとしています。私はXMLファイルの構造がかなり複雑であるため、私はクラスを生成するためにオンラインツールを使用しました。これは、メインクラスのListプロパティに繰り返されるアイテムの数を除いて、うまくいきました。XMLからの非直列化時にリストプロパティが設定されない

私はWPFでDotNet 4.5、C#を使用しています。

<orderMessage xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:gs1:ecom:order:xsd:3"> 
    <order xmlns=""> 
    <creationDateTime>2017-07-10T00:00:00</creationDateTime> 
    <documentStatusCode>ORIGINAL</documentStatusCode> 
    <documentActionCode>ADD</documentActionCode> 
    </order> 
    <order xmlns=""> 
    <creationDateTime>2017-07-10T00:00:00</creationDateTime> 
    <documentStatusCode>ORIGINAL</documentStatusCode> 
    <documentActionCode>ADD</documentActionCode> 
    </order> 
</orderMessage> 

私が使用していたクラスは以下の通りです::次のように

[XmlRoot(ElementName = "order")] 
public class Order 
{ 
    [XmlElement(ElementName = "creationDateTime")] 
    public string CreationDateTime { get; set; } 
    [XmlElement(ElementName = "documentStatusCode")] 
    public string DocumentStatusCode { get; set; } 
    [XmlElement(ElementName = "documentActionCode")] 
    public string DocumentActionCode { get; set; } 
    [XmlAttribute(AttributeName = "xmlns")] 
    public string Xmlns { get; set; } 
} 

[XmlRoot(ElementName = "orderMessage", Namespace = "urn:gs1:ecom:order:xsd:3")] 
public class OrderMessage 
{ 
    [XmlElement(ElementName = "order")] 
    public List<Order> Order { get; set; } 
    [XmlAttribute(AttributeName = "xsd", Namespace = "http://www.w3.org/2000/xmlns/")] 
    public string Xsd { get; set; } 
    [XmlAttribute(AttributeName = "xsi", Namespace = "http://www.w3.org/2000/xmlns/")] 
    public string Xsi { get; set; } 
    [XmlAttribute(AttributeName = "xmlns")] 
    public string Xmlns { get; set; } 
} 

デシリアライズコードは次のように

xmlファイルの簡易版である

 XmlSerializer serializer = new XmlSerializer(typeof(OrderMessage)); 

     StreamReader reader = new StreamReader(filename); 
     OrderMessage newOrderMessage; 
     try 
     { 
      newOrderMessage = (OrderMessage)serializer.Deserialize(reader); 
     } 
     catch (Exception e) 
     { 
      throw e; 
     } 
     reader.Close(); 

コードを実行するとエラーなしで実行されますが、空のリストになります。 xmlには他の構造がありました(繰り返し構造ではないためリストプロパティはありません)。

私は似たような質問をいくつか見ましたが、私が使っているのと同じ方法を示唆しているようです。

私はそのままXMLを第三者から変更することはできません。

誰かが私を正しい方向に向けることができれば、大変感謝しています。

私は、エラーをキャッチしてそれを使用することはまったくないことを知っていますが、ブレークポイントを追加するようにしたので、内部例外があれば見れます。私は一度プロセスが働いたら、エラー処理をより意味のあるものにします。

+0

リストを表すへの親がないので、私はそれが起こっているとは思わない。それはテスト順序1回のテストの注文2

+0

@VarunMehta私はそれを試してみましたが、それはまだあなたが受注にあなたの財産とXML要素名の名前を変更しました同じこと – james33

+0

をしたようなものでなければなりませんか?XmlElement(ElementName = "orders")] 公開リスト注文{get;セット; } –

答えて

2

問題はOrderプロパティです。名前空間はOrderMessageから継承されるため、空の場合はurn:gs1:ecom:order:xsd:3になります。これを明示的に指定する必要があります。

また、モデルから名前空間関連の属性を削除することもできます。さておき、throw e;あなたのデシリアライゼーションコードのよう

[XmlRoot("orderMessage", Namespace = "urn:gs1:ecom:order:xsd:3")] 
public class OrderMessage 
{ 
    [XmlElement("order", Namespace = "")] 
    public List<Order> Orders { get; set; } 
} 

public class Order 
{ 
    [XmlElement("creationDateTime")] 
    public string CreationDateTime { get; set; } 

    [XmlElement("documentStatusCode")] 
    public string DocumentStatusCode { get; set; } 

    [XmlElement("documentActionCode")] 
    public string DocumentActionCode { get; set; } 
} 

あなたは(this questionを参照)何をしたいのか、おそらくではありません:これはあなたが必要とするすべてです。実際に例外を処理していないとすれば、この場合はtry/catchを完全に削除することができます。

StreamReaderusingブロックに封入して、使用後に廃棄するようにしてください。

+0

パーフェクト - ありがとうございました!だからあなたは専門家に行く – james33

+0

他のヒントをありがとう - 彼らは確かに役立つ – james33

関連する問題