XPathJava在更多条件下解析xml文档 XPathJava在更多条件下解析xml

XPathJava在更多条件下解析xml文档 XPathJava在更多条件下解析xml,java,xml,parsing,xpath,Java,Xml,Parsing,Xpath,我需要显示books.xml中满足下面两个条件的元素 条件:价格>10,发布日期>2006-12-31。books.xml是: <?xml version='1.0'?> <catalog> <book id='bk110'> <author>O'Brien, Tim</author> <title>Microsoft .NET: The Programming Bible</title&

我需要显示books.xml中满足下面两个条件的元素 条件:价格>10,发布日期>2006-12-31。books.xml是:

<?xml version='1.0'?>
<catalog>
   <book id='bk110'>
      <author>O'Brien, Tim</author>
      <title>Microsoft .NET: The Programming Bible</title>
      <genre>Computer</genre>
      <price>36.95</price>
      <publish_date>2006-12-09</publish_date>
      <description>Microsoft's .NET initiative is explored in 
      detail in this deep programmer's reference.</description>
   </book>
   <book id='bk111'>
      <author>O'Brien, Tim</author>
      <title>MSXML3: A Comprehensive Guide</title>
      <genre>Computer</genre>
      <price>36.95</price>
      <publish_date>2007-12-01</publish_date>
      <description>The Microsoft MSXML3 parser is covered in 
      detail, with attention to XML DOM interfaces, XSLT processing, 
      SAX and more.</description>
   </book>
   <book id='bk112'>
      <author>Galos, Mike</author>
      <title>Visual Studio 7: A Comprehensive Guide</title>
      <genre>Computer</genre>
      <price>49.95</price>
      <publish_date>2008-04-16</publish_date>
      <description>Microsoft Visual Studio 7 is explored in depth,
      looking at how Visual Basic, Visual C++, C#, and ASP+ are 
      integrated into a comprehensive development 
      environment.</description>
   </book>
</catalog>

怎么了?谢谢大家!

您试图使用XPath 2.0数据类型,如
xs:date
,而Oracle JRE中的XPath实现只支持XPath 1.0,而XPath 1.0不知道任何此类数据类型。对于这个特定的路径表达式,应该可以使用XPath 1.0和简单的数字比较,并使用类似于
//book[price>10][number(translate(publish_date,'-','')>20051231]
的路径


如果您想使用XPath 2.0,您需要研究第三方库,如Saxon 9或XQuery实现(因为XPath 2.0是XQuery 1.0的子集)。

问题已经解决。非常感谢。如何在java代码中使用XPath2.0?正如我所说,您需要使用第三方库,如Saxon 9。如果您使用它,您可以查看有关如何从Java使用XPath2.0的详细信息。
package web.services;
import java.io.File;
import java.io.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.xml.xpath.*;
import org.xml.sax.*;
import org.w3c.dom.*;

public class WebServices {

    private static void showElements() {
        InputSource inputSource = null;
        Object result;
        NodeList nodeList = null;
        String file;
        String workingDir = System.getProperty("user.dir");

        file="data"+File.separator+"books.xml";
        try {
            XPathFactory factory = XPathFactory.newInstance();
            XPath xPath = factory.newXPath();
            XPathExpression xPathExpression = xPath.compile("//book[price > 10][xs:date(publish_date) > xs:date('2005-12-31')]/*/text()");
            File xmlDocument = new File(file);
            try {
                inputSource = new InputSource(new FileInputStream(xmlDocument));
            } catch (FileNotFoundException ex) {
                Logger.getLogger(WebServices.class.getName()).log(Level.SEVERE, null, ex);
            }
            result = xPathExpression.evaluate(inputSource, XPathConstants.NODESET);
            nodeList = (NodeList) result;
        } catch (XPathExpressionException ex) {
            Logger.getLogger(WebServices.class.getName()).log(Level.SEVERE, null, ex);
        }

        for (int i = 0; i < nodeList.getLength(); i++) {
            System.out.print("Node name: " + nodeList.item(i).getNodeName());
            System.out.print(" | ");
            System.out.println("Node value: " + nodeList.item(i).getNodeValue());
            System.out.println("------------------------------------------------");
        }
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        showElements();
    }
}
    maj 27, 2015 10:01:19 AM web.services.WebServices showElements
SEVERE: null

javax.xml.transform.TransformerException: Unknown error in XPath.
    at com.sun.org.apache.xpath.internal.XPath.execute(XPath.java:368)
    at com.sun.org.apache.xpath.internal.XPath.execute(XPath.java:305)
    at com.sun.org.apache.xpath.internal.jaxp.XPathExpressionImpl.eval(XPathExpressionImpl.java:135)
    at com.sun.org.apache.xpath.internal.jaxp.XPathExpressionImpl.eval(XPathExpressionImpl.java:109)
    at com.sun.org.apache.xpath.internal.jaxp.XPathExpressionImpl.evaluate(XPathExpressionImpl.java:303)
    at web.services.WebServices.showElements(WebServices.java:39)
    at web.services.WebServices.main(WebServices.java:58)
Caused by: java.lang.NullPointerException
    at com.sun.org.apache.xpath.internal.functions.FuncExtFunction.execute(FuncExtFunction.java:210)
    at com.sun.org.apache.xpath.internal.Expression.execute(Expression.java:157)
    at com.sun.org.apache.xpath.internal.operations.Operation.execute(Operation.java:111)
    at com.sun.org.apache.xpath.internal.axes.PredicatedNodeTest.executePredicates(PredicatedNodeTest.java:344)
    at com.sun.org.apache.xpath.internal.axes.PredicatedNodeTest.acceptNode(PredicatedNodeTest.java:481)
    at com.sun.org.apache.xpath.internal.axes.AxesWalker.nextNode(AxesWalker.java:374)
    at com.sun.org.apache.xpath.internal.axes.WalkingIterator.nextNode(WalkingIterator.java:197)
    at com.sun.org.apache.xpath.internal.axes.NodeSequence.nextNode(NodeSequence.java:344)
    at com.sun.org.apache.xpath.internal.axes.NodeSequence.runTo(NodeSequence.java:503)
    at com.sun.org.apache.xpath.internal.axes.NodeSequence.setRoot(NodeSequence.java:279)
    at com.sun.org.apache.xpath.internal.axes.LocPathIterator.execute(LocPathIterator.java:214)
    at com.sun.org.apache.xpath.internal.XPath.execute(XPath.java:339)
    ... 6 more
---------
java.lang.NullPointerException
    at com.sun.org.apache.xpath.internal.functions.FuncExtFunction.execute(FuncExtFunction.java:210)
    at com.sun.org.apache.xpath.internal.Expression.execute(Expression.java:157)
    at com.sun.org.apache.xpath.internal.operations.Operation.execute(Operation.java:111)
    at com.sun.org.apache.xpath.internal.axes.PredicatedNodeTest.executePredicates(PredicatedNodeTest.java:344)
    at com.sun.org.apache.xpath.internal.axes.PredicatedNodeTest.acceptNode(PredicatedNodeTest.java:481)
    at com.sun.org.apache.xpath.internal.axes.AxesWalker.nextNode(AxesWalker.java:374)
    at com.sun.org.apache.xpath.internal.axes.WalkingIterator.nextNode(WalkingIterator.java:197)
    at com.sun.org.apache.xpath.internal.axes.NodeSequence.nextNode(NodeSequence.java:344)
    at com.sun.org.apache.xpath.internal.axes.NodeSequence.runTo(NodeSequence.java:503)
    at com.sun.org.apache.xpath.internal.axes.NodeSequence.setRoot(NodeSequence.java:279)
    at com.sun.org.apache.xpath.internal.axes.LocPathIterator.execute(LocPathIterator.java:214)
    at com.sun.org.apache.xpath.internal.XPath.execute(XPath.java:339)
    at com.sun.org.apache.xpath.internal.XPath.execute(XPath.java:305)
    at com.sun.org.apache.xpath.internal.jaxp.XPathExpressionImpl.eval(XPathExpressionImpl.java:135)
    at com.sun.org.apache.xpath.internal.jaxp.XPathExpressionImpl.eval(XPathExpressionImpl.java:109)
    at com.sun.org.apache.xpath.internal.jaxp.XPathExpressionImpl.evaluate(XPathExpressionImpl.java:303)
    at web.services.WebServices.showElements(WebServices.java:39)
    at web.services.WebServices.main(WebServices.java:58)
--------------- linked to ------------------
javax.xml.xpath.XPathExpressionException: javax.xml.transform.TransformerException: Unknown error in XPath.
    at com.sun.org.apache.xpath.internal.jaxp.XPathExpressionImpl.evaluate(XPathExpressionImpl.java:305)
    at web.services.WebServices.showElements(WebServices.java:39)
    at web.services.WebServices.main(WebServices.java:58)
Caused by: javax.xml.transform.TransformerException: Unknown error in XPath.
    at com.sun.org.apache.xpath.internal.XPath.execute(XPath.java:368)
    at com.sun.org.apache.xpath.internal.XPath.execute(XPath.java:305)
    at com.sun.org.apache.xpath.internal.jaxp.XPathExpressionImpl.eval(XPathExpressionImpl.java:135)
    at com.sun.org.apache.xpath.internal.jaxp.XPathExpressionImpl.eval(XPathExpressionImpl.java:109)
    at com.sun.org.apache.xpath.internal.jaxp.XPathExpressionImpl.evaluate(XPathExpressionImpl.java:303)
    ... 2 more
Caused by: java.lang.NullPointerException
    at com.sun.org.apache.xpath.internal.functions.FuncExtFunction.execute(FuncExtFunction.java:210)
    at com.sun.org.apache.xpath.internal.Expression.execute(Expression.java:157)
    at com.sun.org.apache.xpath.internal.operations.Operation.execute(Operation.java:111)
    at com.sun.org.apache.xpath.internal.axes.PredicatedNodeTest.executePredicates(PredicatedNodeTest.java:344)
    at com.sun.org.apache.xpath.internal.axes.PredicatedNodeTest.acceptNode(PredicatedNodeTest.java:481)
    at com.sun.org.apache.xpath.internal.axes.AxesWalker.nextNode(AxesWalker.java:374)
    at com.sun.org.apache.xpath.internal.axes.WalkingIterator.nextNode(WalkingIterator.java:197)
    at com.sun.org.apache.xpath.internal.axes.NodeSequence.nextNode(NodeSequence.java:344)
    at com.sun.org.apache.xpath.internal.axes.NodeSequence.runTo(NodeSequence.java:503)
    at com.sun.org.apache.xpath.internal.axes.NodeSequence.setRoot(NodeSequence.java:279)
    at com.sun.org.apache.xpath.internal.axes.LocPathIterator.execute(LocPathIterator.java:214)
    at com.sun.org.apache.xpath.internal.XPath.execute(XPath.java:339)
    ... 6 more

Exception in thread "main" java.lang.NullPointerException
    at web.services.WebServices.showElements(WebServices.java:45)
    at web.services.WebServices.main(WebServices.java:58)
Java Result: 1
BUILD SUCCESSFUL (total time: 2 seconds)