2012-03-14 11 views
0

要件 XMLツリーを読み込み、オブジェクトに遭遇した属性を埋め込み、すべてのメソッドを実行した後に(データベースに挿入します)。両親の量は、例えば、アドレス死死アドレス・アドレス、それができる、また、順序が指定されていない、指定されていないLINQ to XMLを使用しているIDのないXMLツリーを解析します。

入力ファイル

概要:

<Root> 
    <Element> 
    <Element2> 
     <Parent> 
     <Child> 
      <Grandchild> 
      <Grandchild> 
     </Child> 
     </Parent> 
    </Element2> 
    </Element1> 
</Root> 

全例:

<?xml version="1.0" encoding="utf-8" ?> 
<Root> 
    <Element1> 
    <Element2> 
     <Parent> 
     <Child> 
      <Grandchild> 
      <number>01</number> 
      <name>Person</name> 
      <Rows> 
       <Row> 
       <number>0110</number> 
       <name>ID</name> 
       <value>123456789</value> 
       </Row> 
      </Rows> 
      </Grandchild> 
      <Grandchild> 
      <number>08</number> 
      <name>Address</name> 
      <Rows> 
       <Row> 
       <number>1110</number> 
       <name>street</name> 
       <value>first aveneu</value> 
       </Row> 
       <Row> 
       <number>1120</number> 
       <name>streetnumber</name> 
       <value>345</value> 
       </Row> 
       <Row> 
       <number>1130</number> 
       <name>zip</name> 
       <value>2938PS</value> 
       </Row> 
       <Row> 
       <number>1160</number> 
       <name>country</name> 
       <value>Germany</value> 
       </Row> 
      </Rows> 
      </Grandchild> 
     </Child> 
     </Parent> 
     <Parent> 
     <Child> 
      <Grandchild> 
      <number>01</number> 
      <name>Person</name> 
      <Rows> 
       <Row> 
       <number>0110</number> 
       <name>ID</name> 
       <value>987654321</value> 
       </Row> 
      </Rows> 
      </Grandchild> 
      <Grandchild> 
      <number>06</number> 
      <name>Death</name> 
      <Rows> 
       <Row> 
       <number>0810</number> 
       <name>date</name> 
       <value>2012-01-03</value> 
       </Row> 
       <Row> 
       <number>0820</number> 
       <name>placeOfDeath</name> 
       <value>attic</value> 
       </Row> 
       <Row> 
       <number>0830</number> 
       <name>funeral</name> 
       <value>burrial</value> 
       </Row> 
      </Rows> 
      </Grandchild> 
     </Child> 
     </Parent> 
    </Element2> 
    </Element1> 
</Root> 

親の遭遇後の結果 所望孫の種類(数6死番号8はアドレスである)すべての親のHAを決定します■孫の番号1「人」は、第2の孫は死亡または住所のいずれかです。

Person person = new Person(); 
person.ID = value; <--- filled with 123456789 

person.street = value;   <--- filled with first aveneu 
person.streetnumber = value; <--- filled with 345 
person.zip = value;   <--- filled with 2938PS 
person.country = value;  <--- filled with germany 

person.DoMethod(); // inserts the value in db 

は、次の親続きを読む最初の親読み。どのように私はすべての子供のための第二孫の名前の要素をターゲットにします:

Person person = new Person(); 
person.ID = value;  <--- filled with 987654321 

person.date   = value; <--- filled with 2012-01-03 
person.placeOfDeath = value; <--- filled with attic 
person.funeral  = value; <--- filled with burrial 

person.DoMethod(); // insert the values in db 

なしの両親まで続きを読むには

EDITを見つけましたか?アドレスまたは死亡

コード/クレジット

のように私はさらに、この、ダニエルHilgarthの助けを借りてしまった:Linq to XML (C#) parse XML tree with no attributes/id to object XMLツリーは変わっていない、と私は本当にこだわっています..その間に私が投稿してみてください新しい作業コード...

+0

正確 'person.1110は何ですか:あなたはPersonインスタンスを記入するノードごとChildノードについて(namevalueノードの値)から辞書を作成し、それらのキーと値のペアを反復する必要があります'?それは決してコンパイルされません。 –

+0

特定の.1110を意味しますか? 通りを意味する可能性があります。 person.street = "first aveneu"などです。 – Danny

+0

xmlサンプルを読みやすくするために変更しました。 – Danny

答えて

0

これはDanielが提案した方法で、あなたが言及した質問で行うことができます。

var doc = XDocument.Parse(xml); 
var children = doc.Descendants("Child") 
    .Select(c => c.Descendants("Row") 
     .ToDictionary(
      r => r.Element("name").Value, 
      r => r.Element("value").Value 
     ) 
    ); 

foreach (var child in children) 
{ 
    Person person = new Person(); 
    foreach (var key in child.Keys) 
    { 
     switch (key) 
     { 
      case "ID": 
       person.ID = int.Parse(child[key]); 
       break; 
      case "street": 
       person.street = child[key]; 
       break; 
      case "streetnumber": 
       person.streetnumber = child[key]; 
       break; 
      case "zip": 
       person.zip = child[key]; 
       break; 
      case "country": 
       person.country = child[key]; 
       break; 
      case "date": 
       person.date = DateTime.Parse(child[key]); 
       break; 
      case "placeOfDeath": 
       person.placeOfDeath = child[key]; 
       break; 
      case "funeral": 
       person.funeral = child[key]; 
       break; 
      default: 
       break; 
     } 
    } 

    person.DoMethod(); 
} 
+0

しかしdoメソッドを使う順序はどうですか?死と住所の属性は同じforeachループ内にあります。なぜなら、背後にある論理は「6番/死亡(または8番番アドレス)に当たったときにのみ死の属性を埋めるのですから? – Danny

関連する問題