2012-01-24 6 views
0

私はLINQ to XMLを初めて使用しています。私はチュートリアルを見てきましたが、私のブロックを通過させるのに十分な深さのものは見つかりませんでした。私の場合、私は特定の住所に関する情報について私たちのベンダーにヒットしました。アドレスが完全一致ではない可能性があるため、可能なアドレスを持つXMLファイルを送り返します。LINQ to XML詳細な解析が必要

<POSSIBLE-ADDRESSES> 
       <POS-ADDR> 
       <BUILDING> 
        <Street>1905 W HENDERSON RD          </Street> 
        <City>COLUMBUS      </City> 
        <RiskID>123456</RiskID> 
       </BUILDING> 
       <OCCUPANTS> 
        <OCCUP> 
        <ID>010</ID> 
        <Desc>MC DONALD'S RESTAURANT (1S)  </Desc> 
        </OCCUP> 
        <OCCUP> 
        <ID>015</ID> 
        <Desc>MC DONALD'S RESTAURANT    </Desc> 
        </OCCUP> 
       </OCCUPANTS> 
       </POS-ADDR> 
       <POS-ADDR> 
       <BUILDING> 
        <Street>1821 HENDERSON RD          </Street> 
        <City>UPPER ARLINGTON    </City> 
        <RiskID>1234567</RiskID> 
       </BUILDING> 
       <OCCUPANTS> 
        <OCCUP> 
        <ID>010</ID> 
        <Desc>ARLINGTON SQUARE SHOPPING CTR (1S) </Desc> 
        </OCCUP> 
        <OCCUP> 
        <ID>015</ID> 
        <Desc>1821 SWAN DRY CLNG     </Desc> 
        </OCCUP> 
        <OCCUP> 
        <ID>020</ID> 
        <Desc>4681 ALEX'S BISTRO ON REED/REST </Desc> 
        </OCCUP> 
        <OCCUP> 
        <ID>025</ID> 
        <Desc>4687-93 BLUMEN GARTEN    </Desc> 
        </OCCUP> 
        <OCCUP> 
        <ID>030</ID> 
        <Desc>4697 BLIMPIE/SANDWICH SHOP   </Desc> 
        </OCCUP> 
       </OCCUPANTS> 
       </POS-ADDR> 
      </POSSIBLE-ADDRESSES> 

今、私は何をすべきかあなたがこれよりも多く存在することができ、すべての建物(心を引くです。ここ

は、アドレスクエリから戻ってくるアドレスの複数のリストのためのXMLの特定のチャンクがあります)を次にリストボックスにバインドします。 - no biggie:

var qBuildings = from LOP in loaded.Descendants("BUILDING") 
    select new 
    { 
     BuildingName = LOP.Element("Street").Value, 
     RiskId = LOP.Element("RiskID").Value 
    }; 

これは、リスクIDとともに必要なすべての建物を私に提供します。

キッカーは、ユーザーがリスクIDに基づいて特定の建物を選択したときに、「占有者」を最初からどのように引っ張るかを示します。最初のRiskIDは「123456」です。したがって、ユーザーがこの建物を選択すると、外出し、乗客クラスを水分補給してその階級を乗客のリストに追加し、それを別のリストボックスにバインドします。

これまでに試したことのすべては、乗員を確保しようとしたときに悪い結果をもたらしました。私はそれがナビゲーションの問題でなければならないことは分かっていますが、何か役に立つものを返すような方法でクエリを構築することはできません。各リスクIDは一意であり、各建物には何人もの人がいないことがあります。だから、私は乗客を引っ張る方法で迷っています。

ご協力いただければ幸いです。

答えて

0

特定のriskIdを持つpos-addrから占有者を選択したいと思うようです。 LINQ-to-XMLでは、次のようになります。

var posAddr = 
    (from pos in possibleAddresses.Elements("POS-ADDR") 
    where (int)pos.Element("BUILDING").Element("RiskID") == riskIdToLookFor 
    select pos) 
    .Single(); 

var occupants = 
    from o in posAddr.Element("OCCUPANTS").Elements("OCCUP") 
    select new 
    { 
     Description = (string)o.Element("DESC") 
    } 
+0

私は宇宙を単一の方程式であると認識しており、とても単純です。うわー、これは簡単で、完璧に動作します(危険なIDは実際には文字列であり、保護される必要があります)。ちょっと動かして "POS-ADDR"の参照をその時点でXDocument.Descendants( "POS-ADDR")に入っていれば、右のビルディングブロックが検出され、与えられた断片が応答XMLの非常に小さな断片だったので、特定のRiskIDの占有者しかいなかった。 !!! –

+0

Descendants()の代わりに 'Elements()'を使用した理由があります。ドキュメント内のどこを探すかを指定する方が良いでしょう。正確に何が起こっているのですか?もしあなたがルート要素だけを持っていれば、 'Element()'への一連の呼び出しを使うことができます。 – svick