2012-03-11 17 views
0

関係(1対多)とオブジェクト:xmlの解析。私はxmlファイル持って

BasePlace(多一と関係)BasePlaceHallPlan

<?xml version='1.0' encoding='windows-1251' standalone='yes'?><XML> 
    <Result>Ok</Result> 
    <Error></Error> 
    <Remark></Remark> 
    <Data> 
    <Theatres> 
     <Theatre ID='1' ShowBusyPlaces='1'> // maybe more than one 
     <Name><![CDATA[PlaceName]]></Name> 
     <NameFull><![CDATA[PlaceName]]></NameFull> 
     <Remark><![CDATA[]]></Remark> 
     <Address><![CDATA[]]></Address> 
     <Halls Count='3'> 
      <Hall ID='1'> 
      <Name><![CDATA[Redisson]]></Name> 
      <Levels Count='1'> 
       <Level ID='1' Geometry='1'> // maybe more than one 
       <Name><![CDATA[Radisson]]></Name> 
       </Level> 
      </Levels> 
      </Hall> 
      <Hall ID='3'> 
      <Name><![CDATA[Test 2]]></Name> 
      <Levels Count='0'></Levels> 
      </Hall> 
      <Hall ID='2'> 
      <Name><![CDATA[тест]]></Name> 
      <Levels Count='1'> 
       <Level ID='4' Geometry='2'> 
       <Name><![CDATA[ттт]]></Name> 
       </Level> 
      </Levels> 
      </Hall> 
     </Halls> 
     </Theatre> 
    </Theatres> 
    </Data> 
</XML> 

そして、私は2つのクラスを持っています: OID, Name, Address
HallPlanOID, BasePlaceId, HallId, LevelId

結果上記の例ではなければならない場合:

BasePlace table: 
OID  Name   Address 
1  PlaceName  

HallPlan table: 
OID  BasePlaceId, HallId, LevelId 
1   1   1  1 
2   1   2  4 
3   1   3  null 

このクエリの戻りはBasePlaceオブジェクト塗りつぶし:(すべてのフィールドとBasePlaceに関連して)適切にHallPlanを埋めるためにどのように

var places = from element in XDocument.Parse(xml).Descendants("Theatre") 
          select new BasePlace 
            { 
             OIDPremiera = (int) element.Attribute("ID"), 
             Name = (string) element.Element("Name"), 
             Address = (string) element.Element("Address"), 
            }; 

を?おかげさまで

答えて

0

それはの効果に何かをする必要があります:

 var plans = from element in XDocument.Parse(xml).Descendants("Hall") 
        select new HallPlan 
        { 
         OIDHallPlan = (int) element.Attribute("ID"), 
         BPRef = (BasePlace) (from BasePlace1 in places 
           where (BasePlace1.OIDPremiera == (int)element.Parent.Parent.Attribute("ID")) 
           select BasePlace1).FirstOrDefault(), 
         // ... 
        };