2011-11-15 19 views
1

LINQ to XMLの非常に新機能です。LINQ to XMLクエリの無視

は、私は次のドキュメントがあります

<?xml version="1.0"?> 
<DIDemo> 
    <PurchaseOrders> 
     <PurchaseOrder date="2011-11-15" purchaseordernumber="PO-1234-1234" suppliername="The Greatest Supplier"> 
      <LineItems> 
       <LineItem productcode="PRD-001" productname="A Cool Product" quantity="3" unitprice="276.99"/> 
       <LineItem productcode="PRD-056" productname="A Unique Product" quantity="5" unitprice="316.99"/> 
      </LineItems> 
     </PurchaseOrder> 

     <PurchaseOrder date="2011-11-11" purchaseordernumber="PO-1231-1231" suppliername="The Largest Supplier"> 
      <LineItems> 
       <LineItem productcode="PRD-025" productname="A Useful Product" quantity="8" unitprice="96.99"/> 
       <LineItem productcode="PRD-014" productname="A Wonderful Product" quantity="1" unitprice="916.99"/> 
      </LineItems> 
     </PurchaseOrder> 
    </PurchaseOrders> 
</DIDemo> 

そして、私はpurchaseordernumber属性に基づいて発注書を取得するために非常に単純なクエリをしようとしています。最終目標は、購買発注ノード(属性および明細)からc#オブジェクトを作成することです。

var document = XDocument.Load(PurchaseOrdersFilePath); 
    var partial1 = document.Element("PurchaseOrders"); //This returns null 
    var partial2 = partial1.Elements("PurchaseOrder"); //This one blows up 
    var final = partial2.Single(po => po.Attribute("purchaseordernumber") == criterion.PropertyValue); 

が、これは動作しない場合:

私がしようとしているクエリは、(私が試してみて、問題があります場所を確認するための部分でそれを解散した)以下です。これを照会する正しい方法は何でしょうか?

ありがとうございました。

答えて

2

あなたはベースとしてドキュメントルートを追加する必要があります。

var partial1 = document.Root.Element("PurchaseOrders"); 

代わりに、おそらく簡単にあなたのケースでは、XML文書内のすべてのレベルのすべてのPurchaseOrderのノードを照会するためにDescendants()を使用することができます。

var orders = document.Descendants("PurchaseOrder"); 

そしてもちろん、あなたは最終的な結果でこれを組み合わせることができます:

var order = document.Descendants("PurchaseOrder") 
        .Single(po => (string)po.Attribute("purchaseordernumber") == criterion.PropertyValue); 
+0

ありがとうございます。子孫オプションは機能したオプションでした。 Root.Elementオプションは、Singleステートメントで「InvalidOperationException:シーケンスに要素が含まれていません」例外をスローしました。 –

0

まあ、ファイルの最も外側の要素は<PurchaseOrders>しかし<DIDemo>ではありません。そして、partial1がヌルになると、逆参照するとプログラムが爆発することになります。