我有一个Xml文件,我想在其中基于XPath进行过滤。我尝试了很多例子他们都没有帮助毫无疑问我做错了。 我是XPath的新手,请帮我找到解决方案。
<PeopleBatch Counter="3">
<Citriz ID="1d9a88fe-f9cc-4add-b6d1-01e41c561bfb" mVersion="1.0.0" mSequence="1" pVersion="0.0.1" xmlns="http://Citriz/Schemas">
<People Action="U" Status="CD" PeopleID="1" PeopleShortName="Billy" PeopleLongName="Billy Smith" PeopleTypeCode="Commercial" CountryCode="USA" PeopleStatus="Current">
<PeopleRole Action="U" Status="CD" ID="1" CustomerRoleShortName="Billy" CustomerRoleLongName="Billy Smith" TypeCode="OUTS">
<SendRole RoleType="N" ActiveRole="Y"/>
</PeopleRole>
</People>
</Citriz>
<Citriz ID="1d9a88fe-f9cc-4add-b6d1-01e41c561bfc" mVersion="1.0.0" mSequence="2" pVersion="0.0.1" xmlns="http://Citriz/Schemas">
<People Action="U" Status="CD" PeopleID="2" PeopleShortName="Carl" PeopleLongName="Carl Thomas" PeopleTypeCode="Commercial" CountryCode="USA" PeopleStatus="Current">
<PeopleRole Action="U" Status="CD" ID="2" CustomerRoleShortName="Carl" CustomerRoleLongName="Carl Thomas" TypeCode="INSS">
<SendRole RoleType="N" ActiveRole="Y"/>
</PeopleRole>
</People>
</Citriz>
<Citriz ID="1d9a88fe-f9cc-4add-b6d1-01e41c561bfd" mVersion="1.0.0" mSequence="3" pVersion="0.0.1" xmlns="http://Citriz/Schemas">
<People Action="U" Status="CD" PeopleID="3" PeopleShortName="Ryan" PeopleLongName="Ryan Black" PeopleTypeCode="Commercial" CountryCode="USA" PeopleStatus="Current">
<PeopleRole Action="U" Status="CD" ID="3" CustomerRoleShortName="Ryan" CustomerRoleLongName="Ryan Black" TypeCode="INSS">
<SendRole RoleType="N" ActiveRole="Y"/>
</PeopleRole>
</People>
</Citriz>
我需要所有那些“Citriz”节点,其子节点属性包含TypeCode =“INSS”这个值。或者建议我是否有其他好方法。
答案 0 :(得分:6)
鉴于您正在使用LINQ to XML,我不会使用XPath开始。我会用:
XNamespace ns = "http://Citriz/Schemas";
var nodes = doc.Descendants(ns + "Citriz")
.Where(x => x.Descendants()
.Any(y => (string) x.Attribute("TypeCode") == "INSS"));
或者,如果总是将成为PeopleRole
内People
内的Citriz
元素(每个级别只有一个元素):
XNamespace ns = "http://Citriz/Schemas";
var nodes = doc.Descendants(ns + "Citriz")
.Where(x => (string) x.Element(ns + "People")
.Element(ns + "PeopleRole")
.Attribute("TypeCode") == "INSS"));
我确信这个可以在XPath中理性地完成,但我个人认为LINQ to XML更简单,在分离数据部分(元素名称,期望值等)方面与“代码”部分(“我正在寻找后代”或“我正在寻找属性值”)。
答案 1 :(得分:1)
我认为你有Xml名称空间的问题
XNamespace ns = "http://Citriz/Schemas";
var peopleRole = XDocument.Parse(xml)
.Descendants(ns + "PeopleRole")
.Where(p => p.Attribute("TypeCode").Value == "INSS")
.ToList();
答案 2 :(得分:0)
您可以将XPath视为等同于在文件系统中导航目录树。在xpath查询中添加额外的“目录”会使您更深入地了解DOM树。
//PeopleRole[@TypeCode="inss"]/../..
将找到PeopleRole类型的所有节点,TypeCode属性等于'inss',然后向上移动到树中的级别,返回包含匹配的PeopleRoles的<Citriz>
节点