使用where子句从XDocument中提取XElements列表

时间:2014-04-20 14:29:47

标签: xelement

我有一个XDocument对象,我试图从中提取指定特定条件的所有List。

以下是我的XML

<MyQueue xmlns:ns0 = "http://myprogram">  
    <ns0:QueueReport>  
        <ns0:number>001</ns0:number>
        <ns0:id>A</ns0:id>
        <ns0:name>ABC</ns0:name>
        <ns0:hours>1</ns0:hours>
    </ns0:QueueReport>
    <ns0:QueueReport>
        <ns0:number>001</ns0:number>
        <ns0:id>B</ns0:id>
        <ns0:name>ABC</ns0:name>
        <ns0:hours>2</ns0:hours>
    </ns0:QueueReport>
    <ns0:QueueReport>
        <ns0:number>001</ns0:number>
        <ns0:id>B</ns0:id>
        <ns0:name>ABC</ns0:name>
        <ns0:hours>10</ns0:hours>
    </ns0:QueueReport>
    <ns0:QueueReport>
        <ns0:number>002</ns0:number>
        <ns0:id>A</ns0:id>
        <ns0:name>ABC</ns0:name>
        <ns0:hours>12</ns0:hours>
    </ns0:QueueReport>
    <ns0:QueueReport>
        <ns0:number>003</ns0:number>
        <ns0:id>A</ns0:id>
        <ns0:name>ABC</ns0:name>
        <ns0:hours>20</ns0:hours>
    </ns0:QueueReport>
</ns0:MyQueue>

上面的XML在XDocument对象中说xdoc。我编写以下内容来提取节点及其子节点。

XNamespace b = @"http://myprogram";
var elements =  from e xdoc.Elements(b + "MyQueue")
        where e.Element(b + "QueueReport").Element(b + "number").Value == "001"
        && e.Element(b + "QueueReport").Element(b + "id").Value == "B"
        select e.Elements(b + "QueueReport").ToList();

(请原谅代码中的拼写错误,但不是在编辑器中写的)

元素变量没有任何结果,理想情况下我希望列表中有以下两个元素。

<ns0:QueueReport>
    <ns0:number>001</ns0:number>
    <ns0:id>B</ns0:id>
    <ns0:name>ABC</ns0:name>
    <ns0:hours>2</ns0:hours>
</ns0:QueueReport>

    <ns0:QueueReport>
        <ns0:number>001</ns0:number>
        <ns0:id>B</ns0:id>
        <ns0:name>ABC</ns0:name>
        <ns0:hours>10</ns0:hours>
    </ns0:QueueReport>

请帮忙,我对Linq很新,对于我怎样才能实现这个目标一无所知。

1 个答案:

答案 0 :(得分:0)

以下是我的问题的答案,我可以通过一些精神弯曲来解决这个问题。

XNamespace b = @"http://myprogram";
var elements =  from e xdoc.Elements(b + "MyQueue").(b + "QueueReport")
    where e.Element(b + "number").Value == "001"
    && e.Element(b + "id").Value == "B"
    select e;