簡體   English   中英

XPath Java在更多情況下解析xml文檔

[英]XPath Java parsing xml document under more conditions

XPath Java在更多情況下解析xml

我需要顯示滿足以下兩個條件的books.xml中的元素:price> 10和publish_date>“ 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>

當我嘗試此代碼時:

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)

怎么了? 謝謝!

您正在嘗試使用xs:date類的XPath 2.0數據類型,而Oracle JRE中的XPath實現僅支持不知道任何此類數據類型的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的子集)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM