XPath查询以特定字符串开头并以特定字符串结尾的节点

时间:2014-09-05 10:43:39

标签: xml xpath

我正在处理遗留代码和XML文件,我不允许更改。

它有这样的节点:

<P1StartTest Name="P1 Start Test" DevID="1" RegType="0" StartAddr="9520" DataType="6" />
<P2StartTest Name="P2 Start Test" DevID="1" RegType="0" StartAddr="9521" DataType="6" />
<P3StartTest Name="P3 Start Test" DevID="1" RegType="0" StartAddr="9522" DataType="6" />
<P4StartTest Name="P4 Start Test" DevID="1" RegType="0" StartAddr="9523" DataType="6" />
<P5StartTest Name="P5 Start Test" DevID="1" RegType="0" StartAddr="9524" DataType="6" />
<P1EndTest Name="P1 End Test" DevID="1" RegType="0" StartAddr="9512" DataType="6" />
<P2EndTest Name="P2 End Test" DevID="1" RegType="0" StartAddr="9513" DataType="6" />
<P3EndTest Name="P3 End Test" DevID="1" RegType="0" StartAddr="9514" DataType="6" />
<P4EndTest Name="P4 End Test" DevID="1" RegType="0" StartAddr="9515" DataType="6" />
<P5EndTest Name="P5 End Test" DevID="1" RegType="0" StartAddr="9516" DataType="6" />

我需要选择以P开头并以StartTest结尾的节点,或者有时以EndTest结尾的节点。我知道我必须使用/*[starts-with(name(), 'P')]/*[ends-with(name(), 'StartTest')],但我如何将两者结合起来?我是XPath的新手。

1 个答案:

答案 0 :(得分:3)

您可以像这样组合它们(为便于阅读而格式化):

/*[
    starts-with(name(), 'P') 
        and 
    (
      ends-with(name(), 'StartTest') 
        or 
      ends-with(name(), 'EndTest')
    )
  ]

以上xpath选择以P开头并以StartTestEndTest结尾的节点。或者,如果您实际上一次只需要两个可能的节点名称之一,那将更容易。以StartTest结尾的节点示例:

/*[
    starts-with(name(), 'P') 
        and 
    ends-with(name(), 'StartTest') 
  ]