简体   繁体   中英

XPath Java parsing xml document under more conditions

XPath Java parsing xml under more conditions

I need to show elements from books.xml which satisfy next two conditions: price > 10 and publish_date > "2006-12-31" . books.xml is:

<?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>

When I try this code:

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();
    }
}

I'm getting this error:

    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)

What is wrong? Thank you!

You are trying to use XPath 2.0 data types like xs:date while the XPath implementation in the Oracle JRE only supports XPath 1.0 which does not know any such data types. For that particular path expression it should be possible to use XPath 1.0 and simple number comparison with a path like //book[price > 10][number(translate(publish_date, '-', '')) > 20051231] .

If you want to use XPath 2.0 you need to look into third party libraries like Saxon 9 or into XQuery implementations (as XPath 2.0 is a subset of XQuery 1.0).

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM