【问题标题】:LINQ to XML query ignoranceLINQ to XML 查询无知
【发布时间】:2012-01-20 17:34:09
【问题描述】:

对于 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);

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

感谢您的帮助。

【问题讨论】:

    标签: c# linq-to-xml


    【解决方案1】:

    您必须将文档根添加为基础:

    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);
    

    【讨论】:

    • 谢谢。后代选项是有效的选项。 Root.Element 选项在 Single 语句中引发了“InvalidOperationException:序列不包含元素”异常。
    【解决方案2】:

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

    相关:

    【讨论】:

      【解决方案3】:

      嗯,文件的最外层元素不是&lt;PurchaseOrders&gt;,而是&lt;DIDemo&gt;。一旦partial1 为空,取消引用就会导致你的程序崩溃。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多