我的XML是:
<?xml version="1.0"?>
<company>
<staff id="1001" thedate="2013-01-01">
<firstname>yong</firstname>
<lastname>mook kim</lastname>
<nickname>mkyong</nickname>
<salary>100000</salary>
</staff>
<staff id="2001" thedate="2014-01-01">
<firstname>low</firstname>
<lastname>yin fong</lastname>
<nickname>fong fong</nickname>
<salary>200000</salary>
</staff>
</company>
我需要一个java代码,它可以比较XML中的日期。 我写了这个java代码,但它不起作用:
public static void main(String[] args) {
try {
File fXmlFile = new File("c:\\tmp\\test.xml");
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder;
dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(fXmlFile);
NodeList nList = doc.getElementsByTagName("staff");
for (int temp = 0; temp < nList.getLength(); temp++) {
Node nNode = nList.item(temp);
String exp = "xs:date(@thedate) > xs:date('2013-05-01')"; //here comes the expression, but it does not work
System.out.println(selectBooleanValue(nNode,exp));
}
} catch (Exception e) {
e.printStackTrace();
}
}
private static boolean selectBooleanValue(Node node, String xpathString) {
try {
XPath xpath = XPATH_FACTORY.get().newXPath();
XPathExpression expr = xpath.compile(xpathString);
boolean result = Boolean.valueOf(expr.evaluate(node, XPathConstants.BOOLEAN).toString());
return result;
} catch (XPathExpressionException e) {
return false;
}
}
private static ThreadLocal<XPathFactory> XPATH_FACTORY = new ThreadLocal<XPathFactory>() {
@Override
protected XPathFactory initialValue() {
return XPathFactory.newInstance();
};
};
我总是得到&#34;假,假&#34;输出,所以它不起作用。相应的输出将是:&#34; false,true&#34;
这一行是主要问题:
String exp = "xs:date(@thedate) > xs:date('2013-05-01')"; //here comes the expression, but it does not work
我试过没有xs:
,但它也不起作用。我知道还有其他方法,但我需要用这条线来解决这个问题!我应该使用什么样的表达式来比较实际上是String变量的日期值?
我尝试使用我的代码比较字符串,它可以使用它,但我需要比较日期!
谢谢!
答案 0 :(得分:0)
你似乎使用的XPath 2.0比比较运算符大两个,一个是>
,另一个是gt
。因此,请尝试使用表达式xs:date(@thedate) > xs:date('2013-05-01')
或表达式xs:date(@thedate) gt xs:date('2013-05-01')
。 >
仅在XSLT代码中使用,以确保代码遵循XML规则,这不是纯XPath中所需的。但我想知道你是否完全使用XPath 2.0实现,以及是否也不需要设置命名空间解析器来将xs
前缀映射到XML模式命名空间。
假设您拥有Java内置XPath 1.0实现,您可以做的就是比较数字,以便您可以使用number(translate(@thedate, '-', '')) > 20130501
。