选择带过滤器的节点

时间:2013-05-08 15:01:25

标签: c# xml xpath selectnodes

这是我的xml:

<Instrument RecordCount="3" >
    <Department id = 18384, Sequence=1>
    <InstrumentData StatusCode="1" RoleType="ED" Style="X" DataOther='Data'>
</Department>
<Department id = 18465, Sequence=2>
     <InstrumentData StatusCode="2" RoleType="CD" Style="S" DataOther='Data'>
</Department>
<Department id = 16473, Sequence=3>
    <InstrumentData StatusCode="1" RoleType="CD" Style="T" DataOther='Data'>
</Department>
 </Instrument>

我希望@Status attribute ='1'或'2'而不是@ RoleType ='E'和'F'以及@Style ='S'和'T'用于每个节点。

我有以下声明,但它没有带回正确的结果。

XmlNodeList nodeList = root.SelectNodes(@"//Department[InstrumentData/@Status='1' or Department[InstrumentData/@Status='1' and not (Department[InstrumentData/@RoleType='E' or Department[InstrumentData/@RoleType='F') and (Department[InstrumentData/@Style='S' or Department[InstrumentData/@Style='T') ]", manager);

或者我首先需要获得第一个条件,然后构建xml doc,然后获得下一个条件。

感谢。

2 个答案:

答案 0 :(得分:2)

在xpaht表达式中有复杂条件没有问题。 但是你的例子因为一些错误而无法奏效 *缺少一些括号(]) *示例xml中没有Status属性 *你不能用“或”来组合一个笔记清单。

实施例: 如果您尝试将部门设为InstrumentData/@StatusCode = 2,部门设为InstrumentData/@Style= T

以下内容不起作用:

nodeList = root.SelectNodes("//Department[InstrumentData/@StatusCode='2'] or //Department[InstrumentData/@Style='T' ]");

但你可以这样做:

nodeList = root.SelectNodes("//Department[InstrumentData/@StatusCode='2'] | //Department[InstrumentData/@Style='T' ]");

或(在我看来更好):

nodeList = root.SelectNodes("//Department[InstrumentData/@StatusCode='2' or InstrumentData/@Style='T' ]");

答案 1 :(得分:1)

管理让它发挥作用:

XmlNodeList nodeList0 = root.SelectNodes(@"//ns1:Department[(ns1:InstrumentData/@StatusCode='1'
                                                                or ns1:InstrumentData/@StatusCode='2')
                                                                 and not (ns1:InstrumentData/@RoleType='ED' 
                                                                    or ns1:InstrumentData/@RoleType='FD') 
                                                                and (ns1:InstrumentData/@Style='S' 
                                                                     or ns1:InstrumentData/@Style='T') ]", manager);

感谢您的反馈和及时的回复和输入!!!