将XPath节点的Date + TimeZone与Date进行比较

时间:2014-05-14 20:27:36

标签: date xpath groovy timezone

我需要选择一个节点,其日期+时区元素必须等于某个已知日期( XPath 1.0 ),即:

<Root>
  <Houses>
    <House>
      <BuildDate>2001-05-11-06:00</BuildDate>
      <Price>$400,000</Price>
    </House>
    <House>
      <BuildDate>2005-09-01-05:00</BuildDate>
      <Price>$300,000</Price>        
    </House>
    <House>
      <BuildDate>2004-10-11-06:00</BuildDate>
      <Price>$200,000</Price>        
    </House>
  </Houses>
</Root>

我需要选择Price BuildDate 2005-09-01 (注意缺少时区)。输入只能是日期(2005-09-01)。我所拥有的是:

//Root/Houses/House[BuildDate[text()='2005-09-01']]/Price/text()

但是,由于日期有时区,因此这种比较永远不会产生任何结果。我使用Groovy脚本在SoapUI 4.6.4中运行它。

2 个答案:

答案 0 :(得分:1)

由于您的查询中没有时间/时区,因此您看起来并不能真正有效地使用时区信息。您缺乏信息,因此您永远无法获得所需的结果。但是,您只能比较日期。

您可以检查查询日期是否包含在任何BuildDate个节点中:

//Root/Houses/House[BuildDate[contains(text(),'2005-09-01')]]/Price/text()

或基本相同的

//Root/Houses/House[contains(BuildDate/text(),'2005-09-01')]/Price/text()

这是非常好的XPath 1.0。

答案 1 :(得分:0)

由于这里的日期是文本,您可以直接进行字符串contains检查。使用XmlSlurper,它会是类似的东西:

def xml = '''
<Root>
  <Houses>
    <House>
      <BuildDate>2001-05-11-06:00</BuildDate>
      <Price>$400,000</Price>
    </House>
    <House>
      <BuildDate>2005-09-01-05:00</BuildDate>
      <Price>$300,000</Price>        
    </House>
    <House>
      <BuildDate>2005-09-01-11:00</BuildDate>
      <Price>$600,000</Price>        
    </House>
    <House>
      <BuildDate>2004-10-11-06:00</BuildDate>
      <Price>$200,000</Price>        
    </House>
  </Houses>
</Root>
'''

def parsed = new XmlSlurper().parseText( xml ) 

def myDate = '2005-09-01'
parsed.Houses.House.findAll { it.BuildDate.text().contains( myDate ) }
                   .Price*.text()

注意: - 添加了另一个具有相同日期但价格不同的商品。