2016-03-26 24 views
2

私はC#ASP.NET環境で作業しています。私は、次のXML要素をC#オブジェクト/クラスにデシリアライズしようとしています。要素は3レベル深いです。DataContract XMLのデシリアライズ - 同じ要素内の要素とプロパティのリスト

  <Availability> 
       <RecommendedSegment> 
        <Duration>1720</Duration> 
        <FareBasis>Y77OW</FareBasis> 
        <FlightSegment> 
         <DepDate>11 August</DepDate> 
         <DepTime>0830</DepTime> 
         <ArrDate>11 August</ArrDate> 
         <ArrTime>1110</ArrTime> 
         <DepDay>Mon</DepDay> 
         <ArrDay>Mon</ArrDay> 
         <DepAirport>LHR</DepAirport> 
         <DepAirportName>Heathrow</DepAirportName> 
         <DepCityName>London</DepCityName> 
         <ArrAirport>FRA</ArrAirport> 
         <ArrAirportName>Frankfurt Int'l</ArrAirportName> 
         <ArrCityName>Frankfurt</ArrCityName> 
         <DepCountry>United Kingdom</DepCountry> 
         <ArrCountry>Germany</ArrCountry> 
         <Airline>LH</Airline> 
         <AirName>Lufthansa</AirName> 
         <FlightNo>925</FlightNo> 
         <BookingClass>Y</BookingClass> 
         <AirCraftType>32A</AirCraftType> 
         <ETicket>Y</ETicket> 
         <NonStop>0</NonStop> 
         <DepTer>1</DepTer> 
         <ArrTer>1</ArrTer> 
         <AdtFareBasis>Y77OW</AdtFareBasis> 
         <ChdFareBasis> 
         </ChdFareBasis> 
         <InfFareBasis> 
         </InfFareBasis> 
        </FlightSegment> 
        <FlightSegment> 
         <DepDate>11 August</DepDate> 
         <DepTime>1330</DepTime> 
         <ArrDate>12 August</ArrDate> 
         <ArrTime>0100</ArrTime> 
         <DepDay>Mon</DepDay> 
         <ArrDay>Tue</ArrDay> 
         <DepAirport>FRA</DepAirport> 
         <DepAirportName>Frankfurt Int'l</DepAirportName> 
         <DepCityName>Frankfurt</DepCityName> 
         <ArrAirport>BOM</ArrAirport> 
         <ArrAirportName>Bombay</ArrAirportName> 
         <ArrCityName>Mumbai</ArrCityName> 
         <DepCountry>Germany</DepCountry> 
         <ArrCountry>India</ArrCountry> 
         <Airline>LH</Airline> 
         <AirName>Lufthansa</AirName> 
         <FlightNo>756</FlightNo> 
         <BookingClass>Y</BookingClass> 
         <AirCraftType>744</AirCraftType> 
         <ETicket>Y</ETicket> 
         <NonStop>0</NonStop> 
         <DepTer>1</DepTer> 
         <ArrTer>2</ArrTer> 
         <AdtFareBasis>Y77OW</AdtFareBasis> 
         <ChdFareBasis> 
         </ChdFareBasis> 
         <InfFareBasis> 
         </InfFareBasis> 
        </FlightSegment> 
        <FlightSegment> 
         <DepDate>12 August</DepDate> 
         <DepTime>0515</DepTime> 
         <ArrDate>12 August</ArrDate> 
         <ArrTime>0620</ArrTime> 
         <DepDay>Tue</DepDay> 
         <ArrDay>Tue</ArrDay> 
         <DepAirport>BOM</DepAirport> 
         <DepAirportName>Bombay</DepAirportName> 
         <DepCityName>Mumbai</DepCityName> 
         <ArrAirport>GOI</ArrAirport> 
         <ArrAirportName>Dabolim</ArrAirportName> 
         <ArrCityName>Goa</ArrCityName> 
         <DepCountry>India</DepCountry> 
         <ArrCountry>India</ArrCountry> 
         <Airline>AI</Airline> 
         <AirName>Air India</AirName> 
         <FlightNo>984</FlightNo> 
         <BookingClass>Y</BookingClass> 
         <AirCraftType>321</AirCraftType> 
         <ETicket>Y</ETicket> 
         <NonStop>0</NonStop> 
         <DepTer>2</DepTer> 
         <ArrTer> 
         </ArrTer> 
         <AdtFareBasis>Y</AdtFareBasis> 
         <ChdFareBasis> 
         </ChdFareBasis> 
         <InfFareBasis> 
         </InfFareBasis> 
        </FlightSegment> 
        <DepAirport>LHR</DepAirport> 
        <DepCity>LON</DepCity> 
        <DepCountry>GB</DepCountry> 
        <DepZone>1</DepZone> 
        <ArrAirport>GOI</ArrAirport> 
        <ArrCity>GOI</ArrCity> 
        <ArrCountry>IN</ArrCountry> 
        <ArrZone>5</ArrZone> 
       </RecommendedSegment> 
      </Availability> 

次の3レベルのオブジェクトでデータをキャプチャしようとしています。

[DataContract(Name = "Availability")] 
    public class Availability 
    { 
     [DataMember(Name = "RecommendedSegment", Order = 0)] 
     public RecommendedSegment RecommendedSegment; 
     [DataMember(Name = "RecommendedSegment", Order = 1)] 
     public RecommendedSegmentFlights RecommendedSegmentFlights; 
    } 

コードを実行すると、次の例外が発生します。

"ExceptionMessage":"Type 'Availability' contains two members 'RecommendedSegment' 'and 'RecommendedSegmentFlights' with the same data member name 'RecommendedSegment'. Multiple members with the same name in one type are not supported. Consider changing one of the member names using DataMemberAttribute attribute." 

私は、DataContractを使用しても動作しないことを知りました。 "FlightSegment"要素をRecommendedSegmentFlightsにリストとして取り込む方法はありますか?私は次のいずれかを使用して既定のシリアル化動作をオーバーライドする必要があることを読みました

[OnDeserialized] 
    void OnDeserialized(StreamingContext c) 
    { 
     if (MyCustonObj == null) 
     { 
     MyCustonObj = new MyCustomClass(); 
     MyCustonObj.MyStrData = "Overridden in serialization"; 
     } 
    } 
[OnDeserializing] 
void OnDeserializing(StreamingContext c) 
{ 
    if (MyCustonObj == null) 
    { 
    MyCustonObj = new MyCustomClass(); 
    MyCustonObj.MyStrData = "Overridden in deserializing"; 
    } 
} 

[OnSerialized] 
void OnSerialized(StreamingContext c) 
{ 
    // if you wan to do somehing when serialized here or just remove them 

} 

[OnSerializing] 
void OnSerializing(StreamingContext c) 
{ 
    // if you wan to do somehing during serializing here or just remove them  
} 

どのようにすればいいですか?私が欲しいのは、FlightSegment要素のリストを含むクラス内のRecommendedSegmentFightプロパティです。もしそれがRecommendedSegmentの子であれば私は気にしません。私はこれを持っているRecommendedSegmentFlightsプロパティについては、

public class RecommendedSegmentFlights : List<FlightSegmentStructure> { } 

ありがとうございます。

+0

.....あなたのコードの先頭に

using System.Linq; 

を追加します*あなたは 'DataContractSerializer'を使う必要がありますか? 'XmlSerializer'とは異なり、[外部コンテナ要素なしでリストをシリアライズすることはできません](https:// stackoverflow。com/questions/8591045/data-contract-serializer-how-to-omit-the-outer-of-a-collection)を参照してください。 – dbc

+0

@ user5500750、あなたの問題が解決されたことを願います。私は、http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work ...についてお読みになることをお勧めしますか。... – Monty

+0

DataContractsを使用したソリューションはありますか?モンティの答えはうまくいくようですが、文字列からXMLをデシリアライズする際に問題が発生しています。 – LogicDev

答えて

3

...

Usings(というよりも、DataContractSerializerXmlSerializerを使用しています)...

using System; 
using System.Xml.Serialization; 
using System.Collections.Generic; 
using System.IO; 

クラス...(http://xmltocsharp.azurewebsites.net/を使用してXMLから作成)

[XmlRoot(ElementName = "FlightSegment")] 
public class FlightSegment 
{ 
    [XmlElement(ElementName = "DepDate")] 
    public string DepDate { get; set; } 
    [XmlElement(ElementName = "DepTime")] 
    public string DepTime { get; set; } 
    [XmlElement(ElementName = "ArrDate")] 
    public string ArrDate { get; set; } 
    [XmlElement(ElementName = "ArrTime")] 
    public string ArrTime { get; set; } 
    [XmlElement(ElementName = "DepDay")] 
    public string DepDay { get; set; } 
    [XmlElement(ElementName = "ArrDay")] 
    public string ArrDay { get; set; } 
    [XmlElement(ElementName = "DepAirport")] 
    public string DepAirport { get; set; } 
    [XmlElement(ElementName = "DepAirportName")] 
    public string DepAirportName { get; set; } 
    [XmlElement(ElementName = "DepCityName")] 
    public string DepCityName { get; set; } 
    [XmlElement(ElementName = "ArrAirport")] 
    public string ArrAirport { get; set; } 
    [XmlElement(ElementName = "ArrAirportName")] 
    public string ArrAirportName { get; set; } 
    [XmlElement(ElementName = "ArrCityName")] 
    public string ArrCityName { get; set; } 
    [XmlElement(ElementName = "DepCountry")] 
    public string DepCountry { get; set; } 
    [XmlElement(ElementName = "ArrCountry")] 
    public string ArrCountry { get; set; } 
    [XmlElement(ElementName = "Airline")] 
    public string Airline { get; set; } 
    [XmlElement(ElementName = "AirName")] 
    public string AirName { get; set; } 
    [XmlElement(ElementName = "FlightNo")] 
    public string FlightNo { get; set; } 
    [XmlElement(ElementName = "BookingClass")] 
    public string BookingClass { get; set; } 
    [XmlElement(ElementName = "AirCraftType")] 
    public string AirCraftType { get; set; } 
    [XmlElement(ElementName = "ETicket")] 
    public string ETicket { get; set; } 
    [XmlElement(ElementName = "NonStop")] 
    public string NonStop { get; set; } 
    [XmlElement(ElementName = "DepTer")] 
    public string DepTer { get; set; } 
    [XmlElement(ElementName = "ArrTer")] 
    public string ArrTer { get; set; } 
    [XmlElement(ElementName = "AdtFareBasis")] 
    public string AdtFareBasis { get; set; } 
    [XmlElement(ElementName = "ChdFareBasis")] 
    public string ChdFareBasis { get; set; } 
    [XmlElement(ElementName = "InfFareBasis")] 
    public string InfFareBasis { get; set; } 
} 

[XmlRoot(ElementName = "RecommendedSegment")] 
public class RecommendedSegment 
{ 
    [XmlElement(ElementName = "Duration")] 
    public string Duration { get; set; } 
    [XmlElement(ElementName = "FareBasis")] 
    public string FareBasis { get; set; } 
    [XmlElement(ElementName = "FlightSegment")] 
    public List<FlightSegment> FlightSegment { get; set; } 
    [XmlElement(ElementName = "DepAirport")] 
    public string DepAirport { get; set; } 
    [XmlElement(ElementName = "DepCity")] 
    public string DepCity { get; set; } 
    [XmlElement(ElementName = "DepCountry")] 
    public string DepCountry { get; set; } 
    [XmlElement(ElementName = "DepZone")] 
    public string DepZone { get; set; } 
    [XmlElement(ElementName = "ArrAirport")] 
    public string ArrAirport { get; set; } 
    [XmlElement(ElementName = "ArrCity")] 
    public string ArrCity { get; set; } 
    [XmlElement(ElementName = "ArrCountry")] 
    public string ArrCountry { get; set; } 
    [XmlElement(ElementName = "ArrZone")] 
    public string ArrZone { get; set; } 
} 

[XmlRoot(ElementName = "Availability")] 
public class Availability 
{ 
    [XmlElement(ElementName = "RecommendedSegment")] 
    public RecommendedSegment RecommendedSegment { get; set; } 
} 

これを試してみてくださいコード....

 try 
     { 
      Availability deserializedXML = new Availability(); 
      // Deserialize to object 
      XmlSerializer serializer = new XmlSerializer(typeof(Availability)); 
      using (FileStream stream = File.OpenRead(@"xml.xml")) 
      { 
       deserializedXML = (Availability)serializer.Deserialize(stream); 
      } // Put a break-point here, then mouse-over deserializedXML 
     } 
     catch (Exception) 
     { 

      throw; 
     } 

XMLを.EXEと同じフォルダにあるファイル(xml.xml)に保存してください。

usings ....

using System; 
using System.Xml.Serialization; 
using System.Collections.Generic; 
using System.IO; 
using System.Text; 
using System.Xml; 

クラス...(http://xmltocsharp.azurewebsites.net/を使用してXMLから作成)

[XmlRoot(ElementName = "FlightSegment")] 
public class FlightSegment 
{ 
    [XmlElement(ElementName = "DepDate")] 
    public string DepDate { get; set; } 
    [XmlElement(ElementName = "DepTime")] 
    public string DepTime { get; set; } 
    [XmlElement(ElementName = "ArrDate")] 
    public string ArrDate { get; set; } 
    [XmlElement(ElementName = "ArrTime")] 
    public string ArrTime { get; set; } 
    [XmlElement(ElementName = "DepDay")] 
    public string DepDay { get; set; } 
    [XmlElement(ElementName = "ArrDay")] 
    public string ArrDay { get; set; } 
    [XmlElement(ElementName = "DepAirport")] 
    public string DepAirport { get; set; } 
    [XmlElement(ElementName = "DepAirportName")] 
    public string DepAirportName { get; set; } 
    [XmlElement(ElementName = "DepCityName")] 
    public string DepCityName { get; set; } 
    [XmlElement(ElementName = "ArrAirport")] 
    public string ArrAirport { get; set; } 
    [XmlElement(ElementName = "ArrAirportName")] 
    public string ArrAirportName { get; set; } 
    [XmlElement(ElementName = "ArrCityName")] 
    public string ArrCityName { get; set; } 
    [XmlElement(ElementName = "DepCountry")] 
    public string DepCountry { get; set; } 
    [XmlElement(ElementName = "ArrCountry")] 
    public string ArrCountry { get; set; } 
    [XmlElement(ElementName = "Airline")] 
    public string Airline { get; set; } 
    [XmlElement(ElementName = "AirName")] 
    public string AirName { get; set; } 
    [XmlElement(ElementName = "FlightNo")] 
    public string FlightNo { get; set; } 
    [XmlElement(ElementName = "BookingClass")] 
    public string BookingClass { get; set; } 
    [XmlElement(ElementName = "AirCraftType")] 
    public string AirCraftType { get; set; } 
    [XmlElement(ElementName = "ETicket")] 
    public string ETicket { get; set; } 
    [XmlElement(ElementName = "NonStop")] 
    public string NonStop { get; set; } 
    [XmlElement(ElementName = "DepTer")] 
    public string DepTer { get; set; } 
    [XmlElement(ElementName = "ArrTer")] 
    public string ArrTer { get; set; } 
    [XmlElement(ElementName = "AdtFareBasis")] 
    public string AdtFareBasis { get; set; } 
    [XmlElement(ElementName = "ChdFareBasis")] 
    public string ChdFareBasis { get; set; } 
    [XmlElement(ElementName = "InfFareBasis")] 
    public string InfFareBasis { get; set; } 
} 

[XmlRoot(ElementName = "RecommendedSegment")] 
public class RecommendedSegment 
{ 
    [XmlElement(ElementName = "Duration")] 
    public string Duration { get; set; } 
    [XmlElement(ElementName = "FareBasis")] 
    public string FareBasis { get; set; } 
    [XmlElement(ElementName = "FlightSegment")] 
    public List<FlightSegment> FlightSegment { get; set; } 
    [XmlElement(ElementName = "DepAirport")] 
    public string DepAirport { get; set; } 
    [XmlElement(ElementName = "DepCity")] 
    public string DepCity { get; set; } 
    [XmlElement(ElementName = "DepCountry")] 
    public string DepCountry { get; set; } 
    [XmlElement(ElementName = "DepZone")] 
    public string DepZone { get; set; } 
    [XmlElement(ElementName = "ArrAirport")] 
    public string ArrAirport { get; set; } 
    [XmlElement(ElementName = "ArrCity")] 
    public string ArrCity { get; set; } 
    [XmlElement(ElementName = "ArrCountry")] 
    public string ArrCountry { get; set; } 
    [XmlElement(ElementName = "ArrZone")] 
    public string ArrZone { get; set; } 
} 

[XmlRoot(ElementName = "Availability")] 
public class Availability 
{ 
    [XmlElement(ElementName = "RecommendedSegment")] 
    public RecommendedSegment RecommendedSegment { get; set; } 
} 

コード....これを試してみてください文字列をデシリアライズする

+0

ありがとうございました。これは非常に簡単でまっすぐ進むようです。 XML文字列を逆シリアル化したいとします。 XmlTextReader xmlreader = new XmlTextReader(new System.IO.StringReader(XMLString))の後にエラーが発生しました。「XMLドキュメントにエラーがあります。 – LogicDev

+0

聖なるキリストが働いた!ありがとう! – LogicDev

+0

それは今、私の新しい答えを参照してXML文字列を逆シリアル化するために動作しますか? – Monty

0

...

 string strXML = @"<Availability> 
      <RecommendedSegment> 
       <Duration>1720</Duration> 
       <FareBasis>Y77OW</FareBasis> 
       <FlightSegment> 
        <DepDate>11 August</DepDate> 
        <DepTime>0830</DepTime> 
        <ArrDate>11 August</ArrDate> 
        <ArrTime>1110</ArrTime> 
        <DepDay>Mon</DepDay> 
        <ArrDay>Mon</ArrDay> 
        <DepAirport>LHR</DepAirport> 
        <DepAirportName>Heathrow</DepAirportName> 
        <DepCityName>London</DepCityName> 
        <ArrAirport>FRA</ArrAirport> 
        <ArrAirportName>Frankfurt Int'l</ArrAirportName> 
        <ArrCityName>Frankfurt</ArrCityName> 
        <DepCountry>United Kingdom</DepCountry> 
        <ArrCountry>Germany</ArrCountry> 
        <Airline>LH</Airline> 
        <AirName>Lufthansa</AirName> 
        <FlightNo>925</FlightNo> 
        <BookingClass>Y</BookingClass> 
        <AirCraftType>32A</AirCraftType> 
        <ETicket>Y</ETicket> 
        <NonStop>0</NonStop> 
        <DepTer>1</DepTer> 
        <ArrTer>1</ArrTer> 
        <AdtFareBasis>Y77OW</AdtFareBasis> 
        <ChdFareBasis> 
        </ChdFareBasis> 
        <InfFareBasis> 
        </InfFareBasis> 
       </FlightSegment> 
       <FlightSegment> 
        <DepDate>11 August</DepDate> 
        <DepTime>1330</DepTime> 
        <ArrDate>12 August</ArrDate> 
        <ArrTime>0100</ArrTime> 
        <DepDay>Mon</DepDay> 
        <ArrDay>Tue</ArrDay> 
        <DepAirport>FRA</DepAirport> 
        <DepAirportName>Frankfurt Int'l</DepAirportName> 
        <DepCityName>Frankfurt</DepCityName> 
        <ArrAirport>BOM</ArrAirport> 
        <ArrAirportName>Bombay</ArrAirportName> 
        <ArrCityName>Mumbai</ArrCityName> 
        <DepCountry>Germany</DepCountry> 
        <ArrCountry>India</ArrCountry> 
        <Airline>LH</Airline> 
        <AirName>Lufthansa</AirName> 
        <FlightNo>756</FlightNo> 
        <BookingClass>Y</BookingClass> 
        <AirCraftType>744</AirCraftType> 
        <ETicket>Y</ETicket> 
        <NonStop>0</NonStop> 
        <DepTer>1</DepTer> 
        <ArrTer>2</ArrTer> 
        <AdtFareBasis>Y77OW</AdtFareBasis> 
        <ChdFareBasis> 
        </ChdFareBasis> 
        <InfFareBasis> 
        </InfFareBasis> 
       </FlightSegment> 
       <FlightSegment> 
        <DepDate>12 August</DepDate> 
        <DepTime>0515</DepTime> 
        <ArrDate>12 August</ArrDate> 
        <ArrTime>0620</ArrTime> 
        <DepDay>Tue</DepDay> 
        <ArrDay>Tue</ArrDay> 
        <DepAirport>BOM</DepAirport> 
        <DepAirportName>Bombay</DepAirportName> 
        <DepCityName>Mumbai</DepCityName> 
        <ArrAirport>GOI</ArrAirport> 
        <ArrAirportName>Dabolim</ArrAirportName> 
        <ArrCityName>Goa</ArrCityName> 
        <DepCountry>India</DepCountry> 
        <ArrCountry>India</ArrCountry> 
        <Airline>AI</Airline> 
        <AirName>Air India</AirName> 
        <FlightNo>984</FlightNo> 
        <BookingClass>Y</BookingClass> 
        <AirCraftType>321</AirCraftType> 
        <ETicket>Y</ETicket> 
        <NonStop>0</NonStop> 
        <DepTer>2</DepTer> 
        <ArrTer> 
        </ArrTer> 
        <AdtFareBasis>Y</AdtFareBasis> 
        <ChdFareBasis> 
        </ChdFareBasis> 
        <InfFareBasis> 
        </InfFareBasis> 
       </FlightSegment> 
       <DepAirport>LHR</DepAirport> 
       <DepCity>LON</DepCity> 
       <DepCountry>GB</DepCountry> 
       <DepZone>1</DepZone> 
       <ArrAirport>GOI</ArrAirport> 
       <ArrCity>GOI</ArrCity> 
       <ArrCountry>IN</ArrCountry> 
       <ArrZone>5</ArrZone> 
      </RecommendedSegment> 
     </Availability>"; 

     byte[] bufXML = ASCIIEncoding.UTF8.GetBytes(strXML); 
     MemoryStream ms1 = new MemoryStream(bufXML); 

     // Deserialize to object 
     XmlSerializer serializer = new XmlSerializer(typeof(Availability)); 
     try 
     { 
      using (XmlReader reader = new XmlTextReader(ms1)) 
      { 
       Availability deserializedXML = (Availability)serializer.Deserialize(reader); 

      }// put a break point here and mouse-over Label1Text and Label2Text …. 
     } 
     catch (Exception ex) 
     { 
      throw; 
     } 

そして

List<FlightSegment> FlightSegmentList = (from fs in deserializedXML.RecommendedSegment.FlightSegment select fs).ToList(); 

...(両方の答えのために動作します)これを使用FlightSegmentのリストを取得し、

+0

ありがとう。これはうまくいった。 – LogicDev

関連する問題