LINQ to XML查询无知

时间:2011-11-15 22:42:53

标签: c# 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属性获取采购订单。最终目标是从Purchase Order节点(属性和行项目)创建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);

如果这不起作用。查询这个的正确方法是什么?

感谢您的帮助。

3 个答案:

答案 0 :(得分: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);

答案 1 :(得分:1)

要在文档中的任何位置查找元素,您可以使用Descendants

相关:

答案 2 :(得分:0)

嗯,文件的最外层元素不是<PurchaseOrders>而是<DIDemo>。一旦partial1为空,取消引用它将导致程序爆炸。