【问题标题】:How to write date conversion condition in javax XPath?如何在 javax XPath 中编写日期转换条件?
【发布时间】:2015-03-02 15:09:41
【问题描述】:

我的 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) &gt; 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();
    };
};

我总是得到“假,假”的输出,所以它不起作用。相应的输出将是:“false, true”

这一行是这里的主要问题:

String exp = "xs:date(@thedate) &gt; xs:date('2013-05-01')"; //here comes the expression, but it does not work

我尝试不使用xs:,但它也不起作用。我知道还有其他方法,但我需要用那条线解决这个问题!我应该使用什么样的表达式来比较实际上是字符串变量的日期值?

我尝试了我的代码来比较字符串,它可以使用它,但我需要比较日期!

谢谢!

【问题讨论】:

    标签: java xml xslt xpath


    【解决方案1】:

    您似乎使用的XPath 2.0 有两个大于比较运算符,一个是&amp;gt;,另一个是gt。所以试试表达式xs:date(@thedate) &gt; xs:date('2013-05-01') 或表达式xs:date(@thedate) gt xs:date('2013-05-01')&amp;gt; 仅在 XSLT 代码中使用,以确保代码遵循 XML 规则,这在纯 XPath 中不需要。但我想知道您是否完全使用 XPath 2.0 实现,以及您是否也不需要设置命名空间解析器来将 xs 前缀映射到 XML 模式命名空间。

    假设您有 Java 内置的 XPath 1.0 实现,您所能做的就是比较数字,这样您就可以使用 number(translate(@thedate, '-', '')) &gt; 20130501

    【讨论】:

    • 我确定我建议了正确的 XPath 2.0 语法,但正如我所说,我怀疑你使用 XPath 2.0,我怀疑你的代码总是以 catch (XPathExpressionException e) { return false; } 结尾,这就是你得到 false 的原因.因此,请确保您有一个 XPath 2.0 实现并设置了正确的命名空间上下文以便能够使用 xs:date
    • 你是对的。在哪里以及如何在 java 中设置 XPath2.0 语法和正确的命名空间?
    • Sun 和 Oracle JRE 都带有 XPath 1.0,要拥有 XPath 2.0,您需要像 Saxon 9 这样的第三方实现。恐怕我无法告诉您需要实现的正确接口命名空间解析,如果你想使用 Saxon 则以 saxonica.com/html/documentation/xpath-api/jaxp-xpath 开头。
    • @victorio 命名空间在javax.xml.xpath API 中是个难题,我建议您使用 Saxon 9.x 并使用其原生 s9api,其中 XPathCompiler 有一个简单的 declareNamespace你可以调用的方法。
    猜你喜欢
    • 2017-12-14
    • 1970-01-01
    • 2022-11-24
    • 1970-01-01
    • 2021-04-16
    • 1970-01-01
    • 1970-01-01
    • 2020-08-22
    • 2015-10-29
    相关资源
    最近更新 更多