2011-11-15 174 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"); 

在你的情况或者和可能更容易,您可以使用Descendants()来查询XML文档中的所有级别的所有PurchaseOrder节点:

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

当然,你可以在最后的结果结合起来的:

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

谢谢。后代选项是有效的。 Root.Element选项在Single语句中抛出“InvalidOperationException:Sequence contains no elements”异常。 –

0

好了,文件的最外层元素不是<PurchaseOrders><DIDemo>。一旦partial1为空,解引用它会导致程序崩溃。