今天在写尝试使用java中的xpath接口来解析xml数据时出现了IOException。
程序的源文件如下:
一个xml文件:
<?xml version="1.0" encoding="ISO-8859-1"?>
<bookstore>
<book category="COOKING">
<title lang="en">Everyday Italian</title>
<author>Giada De Laurentiis</author>
<year>2005</year>
<price>30.00</price>
</book>
<book category="CHILDREN">
<title lang="en">Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
<book category="WEB">
<title lang="en">XQuery Kick Start</title>
<author>James McGovern</author>
<author>Per Bothner</author>
<author>Kurt Cagle</author>
<author>James Linn</author>
<author>Vaidyanathan Nagarajan</author>
<year>2003</year>
<price>49.99</price>
</book>
<book category="WEB">
<title lang="zh">Learning XML</title>
<author>Erik T. Ray</author>
<year>2003</year>
<price>39.95</price>
</book>
</bookstore>
出现问题的java代码如下:
InputSource inputSource = new InputSource(new FileInputStream("test.xml"));
XPathFactory factory = XPathFactory.newInstance();
XPath path = factory.newXPath();
XPathExpression expr1 = path.compile("/bookstore/book/title/text()");
XPathExpression expr2 = path.compile("/bookstore/book/price/text()");
System.out.println(expr2.evaluate(inputSource, XPathConstants.STRING));
//在第二次调用evaluate()方法时,出现了IOException
System.out.println(expr1.evaluate(inputSource, XPathConstants.STRING));
跟踪了下源代码,在每次调用Object evaluate(InputSource source, QName returnType)这个方法时都会重新生成DocumentBuilder对象来parse InputSource,每次parse都会把整个文件都解析成dom树并load到内存中,然后关闭流。在第二次parse同一个Inputsource的时候便产生了IOException。于是将上面的代码改造了下便成功了。
try {
DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = builderFactory.newDocumentBuilder();
Document doc = builder.parse(new FileInputStream("test.xml"));
XPathFactory factory = XPathFactory.newInstance();
XPath path = factory.newXPath();
XPathExpression expr1 = path.compile("/bookstore/book/title/text()");
XPathExpression expr2 = path.compile("/bookstore/book/price/text()");
System.out.println(expr1.evaluate(doc, XPathConstants.STRING));
System.out.println(expr2.evaluate(doc, XPathConstants.STRING));
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (XPathExpressionException e) {
e.printStackTrace();
}
分享到:
相关推荐
之前找了好多感觉和自己的需求不太一样,这个可以根据Xpath解析出来xml里所有的信息,十分好用 举个例子 xmlPath = "E://upload/xml/1580242.163.xml"; XPathUtil util = XPathUtil.newInstance(xmlPath); Product ...
js中使用xpath来解析xml元素实用.pdf
Dom,Sax,Xpath解析XML实例,有源码,实例。简单易用,直接可用
XPath解析xml的例子;mybatis入门之xpath解析xml;至少xpath入门
Xpath 解析xml 文件,并转化为csv文件
利用xpah解析xml、提供xpath操作map集合同时减少bean类的生成
NULL 博文链接:https://bbsanwei.iteye.com/blog/266394
XML节点访问的路径表达式【相对路径】和【绝对路径】的匹配原则
使用xpath读取xml中的数据
XML节点访问的路径表达式【相对路径】和【绝对路径】的匹配原则,Dem4j集合XPath解析XML
此算法实现是基于Xpath的xml文件查询,只要输入Xpath路径(全路径)就能返回目标节点信息,同时也支持数据的更新设置。
XML文件在PHP网站开发的轻量级应用中使用非常广泛,而PHP解析和读取XML文件的方式有很多种,比如JS DOM、SimpleXml、Xpath等方式解析XML文件,今天来讲讲在PHP中使用Xpath解析XML的实例,同时通过Xpath解析XML的实例...
与上一个版本一起使用可以可以起到提高效率的目的。本人解析xml的真实文档
js中使用xpath来解析xml元素.docx
纯C语言解析xml字符串,有实例,保证可用,含makefile xmlparse.c xmlparse.h testxml.c 目录:/export/home/chcard/testxml 日志:/export/home/chcard/log testxml.c 是一个测试用例,包含了常用的方法,并有注解 ...
xpath读取XML节点 用jdom包
Demo4j结合XPath解析XML文件路径的表达式
XPath基于XML的树状结构,提供在数据结构树中找寻节点的能力,下面是一小示例,需要的朋友可以参考下
xml文件目前获取数据最简单的方法还是使用xpath,通过网上的多次查询与整理,我认为目前我使用的方法比较容易理解和使用。 共享给朋友们试试看。
xPath.jar,XML解析包。XPath是获取xml中数据的一种方式,其简单语法易用。