【问题标题】:java xpath compare formatted date with current date in xmljava xpath将格式化日期与xml中的当前日期进行比较
【发布时间】:2012-09-23 20:54:36
【问题描述】:

我有这样的 XML 文件:

<books>
<book>
    <id>1</id>
    <validFrom>23.11.2012</validFrom>
    <validTo>26.09.2012</validTo>
</book>
<book>
    <id>2</id>
    <validFrom>14.09.2012</validFrom>
    <validTo>01.08.2012</validTo>
</book>

我想从这个 xml 文件中删除所有书籍,其中 datevalidTo 早于当前日期,但我在 XPath 中查询时遇到问题。

我尝试了不同的方式。

XPathFactory xPathFactory = XPathFactory.newInstance();
        XPath xpath = xPathFactory.newXPath();
        XPathExpression expr 
         = xpath.compile("//book[validTo < fn:current-date()]");

Object result = expr.evaluate(doc, XPathConstants.NODESET);
    NodeList nodes = (NodeList) result;
    for (int i = 0; i < nodes.getLength(); i++) {
        removeFindNodes()
    }

如何格式化 validTo 以便能够与当前日期进行比较?

感谢您的帮助

【问题讨论】:

    标签: java xml date xpath


    【解决方案1】:

    xsd:date 期望格式为yyyy-MM-dd,而您的格式为dd.MM.yyyy。您可以尝试使用substringtranslateconcat 的组合来转换您的格式,但是到那时您的XPath 表达式会变得稍微复杂一些。另一种更容易阅读的解决方案是获取所有validTo 节点,然后然后与Java进行比较:

    XPathExpression expr = xpath.compile("//book/validTo");
    Object result = expr.evaluate(doc, XPathConstants.NODESET);
    NodeList nodes = (NodeList) result;
    
    DateFormat df = new SimpleDateFormat("dd.MM.yyyy");
    Calendar now = Calendar.getInstance();
    now.set(Calendar.HOUR_OF_DAY, 0);
    now.set(Calendar.MINUTE, 0);
    now.set(Calendar.SECOND, 0);
    now.set(Calendar.MILLISECOND, 0);
    
    for (int i = 0; i < nodes.getLength(); i++) {
      Node validToNode = nodes.item(i);
      Date validTo = df.parse(validToNode.getTextContent());
      if (validTo.compareTo(now.getTime()) < 0) {
        Node bookNode = validToNode.getParentNode();
        removeNode(bookNode);
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多