3

私はそのような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 ファイルから、validTo の日付が現在の日付より前のすべての書籍を削除したいのですが、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をフォーマットするにはどうすればよいですか?

ご協力いただきありがとうございます

4

1 に答える 1

1

xsd:dateフォーマットは、である必要がありますがyyyy-MM-dd、あなたのフォーマットはですdd.MM.yyyysubstring、、translateの組み合わせを使用しconcatて形式を変換することもできますが、それまでに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);
  }
}
于 2012-09-23T21:11:56.133 に答える