如何使用C#中的Linq访问此XML结构?
我对这些东西很陌生,很难弄清楚如何正确访问我的数据。我所拥有的是以下形式的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
<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()
};