我正在努力导航到我的XML中的'user'元素;我想要一组用户,以便我可以提取用户名详细信息。我的LINQ查询如下,并且始终为计数返回0(但不是null)
var xApprovers = from d in doc.Root.Descendants("document_version")
.Elements("stages")
.Elements("stage")
.Elements("user")
.Elements("approver_list")
.Elements("approver")
.Elements("user")
where d.Element("docVersionID").Value == vId
select d;
我的XML源是:
<Root>
<document_version>
<version_number>1</version_number>
<version_comments></version_comments>
<creation_date>2011-12-20 09:20:42.877</creation_date>
<docVersionID>00002_0000000453</docVersionID>
<pageno>-1</pageno>
<author>
<user>
<userID>00002_0000000001</userID>
<login>ACRE_ROBOT</login>
<lastname>ROBOT</lastname>
<firstname>ACRE</firstname>
<email>richardtaylor@vcg-kestrel.com</email>
</user>
</author>
<document_approval_cycle_code>0</document_approval_cycle_code>
<document_approval_cycle_status>Not Started</document_approval_cycle_status>
<stage_index>1</stage_index>
<stages>
<stage>
<stage_id>00002_0000001017</stage_id>
<name></name>
<index>1</index>
<conditional_approval>1</conditional_approval>
<upon_rejection_code>0</upon_rejection_code>
<stage_approval_cycle_code>0</stage_approval_cycle_code>
<stage_approval_cycle_status>Not Started</stage_approval_cycle_status>
<stage_approval_code>00001_0000000002</stage_approval_code>
<stage_approval_status>Pending</stage_approval_status>
<approver_list>
<approver>
<user>
<userID>00002_0000000011</userID>
<login>DEVAPP78@APPROVER.COM</login>
<lastname>App 78</lastname>
<firstname>Dev</firstname>
<email>DevApp78@approver.com</email>
</user>
<approval_action />
</approver>
<approver>
<user>
<userID>00002_0000000010</userID>
<login>DEVAPP77@APPROVER.COM</login>
<lastname>App 77</lastname>
<firstname>Dev</firstname>
<email>DevApp77@approver.com</email>
</user>
<approval_action />
</approver>
</approver_list>
</stage>
</stages>
<approvals></approvals>
</document_version>
</Root>
我做错了什么?提前谢谢。
答案 0 :(得分:2)
您有额外的用户选择。尝试
var xApprovers = from d in doc.Root
.Descendants("document_version")
where d.Element("docVersionID").Value == vId
select d.Elements("stages")
.Elements("stage")
.Elements("approver_list")
.Elements("approver")
.Elements("user");
答案 1 :(得分:2)
你有两个问题,你有一个额外的.Elements(“用户”),这是不必要的
您还试图将where子句应用于错误的元素
这是更正后的LINQ,它返回相同的IEnumerable&lt; XElement&gt;中的结果。作为你原来的
var xGood = from docVersion in doc.Root.Descendants( "document_version" )
where docVersion.Element("docVersionID").Value == vId
from d in docVersion.Elements( "stages" )
.Elements( "stage" )
.Elements( "approver_list" )
.Elements( "approver" )
.Elements( "user" )
select d;
这个LINQ和abatishchev之间的显着区别在于它将支持单个xml文档中的多个document_version节点
答案 2 :(得分:1)
为什么不这样做:
from d in doc.Root.Descendants("document_version")
where d.Element("docVersionID").Value == vId
select d.Elements("stages")
.Elements("stage")
.Elements("approver_list")
.Elements("approver")
.Elements("user");
或
doc.Root
.Descendants("document_version")
.SingleOrDefault(d => d.Element("docVersionID").Value == vId).Elements("stages") // sic!
.Elements("stage")
.Elements("approver_list")
.Elements("approver")
.Elements("user");
或者运行XPath:
(IEnumerable)doc.XPathEvaluate(String.Format("Root/document_version/docVersionID[text()='{0}']/../stages/stage/approver_list/approver/user", vId));