如何使用C#中的Linq访问此XML结构?

如何使用C#中的Linq访问此XML结构?,c#,.net,xml,linq,linq-to-xml,C#,.net,Xml,Linq,Linq To Xml,我对这些东西很陌生,很难弄清楚如何正确访问我的数据。我所拥有的是以下形式的XML树: <bpm:ResponseData xmlns:bpm="http://rest.bpm.ibm.com/v1/data"> <status>200</status> <data xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:srch="http://rest.bpm.ibm.com/v1

我对这些东西很陌生,很难弄清楚如何正确访问我的数据。我所拥有的是以下形式的XML树:

<bpm:ResponseData
xmlns:bpm="http://rest.bpm.ibm.com/v1/data">
<status>200</status>    
<data
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:srch="http://rest.bpm.ibm.com/v1/data/search"
xsi:type="srch:SearchDetails">  
    <data>  
        <item key="assignedToUser"/>    
        <item key="bpdName">    
            <value xmlns:ns5="http://www.w3.org/2001/XMLSchema" xsi:type="ns5:string">
                Some process name
            </value>
        </item>
        <item key="instanceDueDate">
            <value xmlns:ns5="http://www.w3.org/2001/XMLSchema" xsi:type="ns5:string">
                2011-09-06T12:35:48Z
            </value>
        </item>
        <item key="taskId">
            <value xmlns:ns5="http://www.w3.org/2001/XMLSchema" xsi:type="ns5:decimal">
                218
            </value>
        </item> 
        <item key="taskSubject">
            <value xmlns:ns5="http://www.w3.org/2001/XMLSchema" xsi:type="ns5:string">
                Task: Some process related task
            </value>
        </item>
    </data> 
    <data>  
        <item key="bpdName">
            <value xmlns:ns5="http://www.w3.org/2001/XMLSchema" xsi:type="ns5:string">
                Another process name
            </value>
        </item> 
        <item key="instanceStatus">
            <value xmlns:ns5="http://www.w3.org/2001/XMLSchema" xsi:type="ns5:string">
                Active
            </value>
        </item> 
        <item key="taskId"> 
            <value xmlns:ns5="http://www.w3.org/2001/XMLSchema" xsi:type="ns5:decimal">
                253
            </value>
        </item>
        <item key="taskSubject">    
            <value xmlns:ns5="http://www.w3.org/2001/XMLSchema" xsi:type="ns5:string">
                Task: Another process related task
            </value>
        </item>
    </data>
</data>
</bpm:ResponseData>
我得到两个数据项。是否有任何方法可以进一步深入它们,返回具有特定“key”属性的子体的值

问候,, 迈克尔

编辑:

我想这会管用的:

var items = from feed in XMLDocument.Descendants("data").Descendants("data") select 
    new{
        subject = from subjects in feed.Elements() where (subjects.Attribute("key").Value=="taskSubject") select subjects.Value,
        id = from subjects in feed.Elements() where (subjects.Attribute("key").Value == "taskId") select subjects.Value
        };

但这看起来很“脏”…

这有点太粗糙了,但它应该可以工作(在Mono 2.10.2上测试):


这有用吗?(用于查询属性值)确实如此。请注意,如果遇到没有
属性的
元素,您的解决方案将导致异常,因为您访问属性
s
Value`属性,而不是让显式转换为字符串来为您处理空大小写。此外,在这种情况下,您的数据属性是
IEnumerable
实例,而不是
string
实例。是的,这就是我首先启动线程的原因。谢谢你的帮助;)没问题。很高兴能帮忙。
var items = from feed in XMLDocument.Descendants("data").Descendants("data") select 
    new{
        subject = from subjects in feed.Elements() where (subjects.Attribute("key").Value=="taskSubject") select subjects.Value,
        id = from subjects in feed.Elements() where (subjects.Attribute("key").Value == "taskId") select subjects.Value
        };
var items = from data in document.Descendants("data")

            let taskId =
                data.Elements("item")
                .Where(i => (string)i.Attribute("key") == "taskId")
                .FirstOrDefault()

            where taskId != null

            let taskSubject = 
                data.Elements("item")
                .Where(i => (string)i.Attribute("key") == "taskSubject")
                .FirstOrDefault()

            where taskSubject != null

            select new {
                TaskId = taskId.Element("value").Value.Trim(),
                TaskSubject = taskSubject.Element("value").Value.Trim()
            };