XPathJava在更多条件下解析xml文档 XPathJava在更多条件下解析xml
我需要显示books.xml中满足下面两个条件的元素 条件:价格>10,发布日期>2006-12-31。books.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&
<?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)