今天在写尝试使用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();
}
分享到:
相关推荐
Java解析XML文件是一种常见的任务,尤其在处理结构化数据或与Web服务交互时。XML(eXtensible Markup Language)是一种标记语言,用于存储和传输数据。本程序使用Java来解析XML文件,提取其中的数据并根据需要进行...
* XPath解析XML示例 * @author whwang */ public class TestXPath { public static void main(String[] args) { try { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); ...
值得注意的是,由于XML与HTML在语法规则上存在差异,如XML要求所有标签都必须闭合,因此在解析XML时,需要明确指定解析器为`org.jsoup.parser.Parser.xmlParser()`,以确保正确解析XML文档。 此外,Jsoup还提供了...
**标题解析:** "Dom4J解析XML" 这个标题明确指出了我们要讨论的核心技术——使用Dom4J库来解析XML文档。Dom4J是一个Java库,它提供了丰富的API来处理XML,包括读取、写入、修改以及查询XML文档。在本文中,我们将...
Java中的Digester库是Apache Commons项目的一部分,它提供了一种方便的方式来解析XML文档,并将解析结果映射到Java对象模型上。这个库特别适合于创建简单的XML到Java对象的映射,而不需要编写大量的手动解析代码。在...
这个示例展示了如何使用DOM4J解析XML文件,访问和遍历元素,使用XPath查询,以及添加新元素并序列化到新的XML文件。 总之,DOM4J是Java开发中处理XML文档的利器,它简化了XML的解析、操作和生成过程,使得开发者能...
以上是关于使用JDOM解析XML的基本方法及优化策略的详细介绍。通过灵活运用这些技巧,我们可以创建出高效且可复用的XML处理代码。在实际开发中,还可以结合其他工具如XPath和XSLT,进一步增强对XML文档的操作能力。
2. **构建文档**:使用解析器对象解析XML源数据(可以是文件、输入流或字符串),得到`Document`对象。 3. **访问元素**:通过`Document`对象获取根元素,再通过遍历或查询方法获取其他元素。 4. **读取数据**:从...
在使用XOM解析XML文件时,首先需要创建一个`Builder`对象,然后调用`build()`方法读取XML文件。例如: ```java File file = new File("example.xml"); Builder builder = new Builder(); try { Document doc = ...
2. 使用`SAXBuilder`的`build()`方法解析XML。 3. 获取`Element`根元素,并通过API遍历或操作XML树。 4. 如果需要将JDOM文档保存回XML文件,可以使用`XMLOutputter`类。 例如,以下代码展示了如何使用JDOM解析XML...
在IT领域,XML(eXtensible Markup Language)是一种用于存储和传输数据的标准化格式,尤其在处理结构化数据时非常常见。JDOM是Java中一个用于处理XML文档的库,它提供了一种高效且方便的方式来创建、读取、修改XML...
以下是一个简单的Java代码示例,展示了如何使用DOM解析器解析XML文档: ```java package com.alisoft.facepay.framework.bean; import java.io.*; import javax.xml.parsers.*; import org.w3c.dom.*; import ...
在Android开发中,访问网络并解析XML数据是常见的任务,特别是在获取服务器提供的API数据时。以下将详细讲解这个过程。 首先,我们需要理解Android中的网络访问。Android提供了多种方式来访问网络,如...
DOM4J提供了对XML Schema的全面支持,允许开发者在解析XML文档时进行严格的模式验证,确保数据的准确性和一致性。这对于企业级应用尤为重要,因为它们往往需要处理大量的结构化数据。 **3. 基于事件的处理** 对于...
在本案例中,我们将讨论如何使用Jsoup解析特定城市的数据,这些数据可能是通过XML格式...理解如何使用Jsoup解析XML可以帮助我们更好地从XML数据源中提取信息,这对于开发、数据分析和自动化任务都是十分有价值的技能。
以下将详细解释如何使用Dome4J解析XML文件以及介绍相关知识点。 1. **Dome4J库的引入**:首先,你需要下载Dome4J库并将其添加到项目的类路径中。这通常通过在构建工具如Maven或Gradle的依赖管理中添加Dome4J的相关...
解析XML通常使用`DOM`(Document Object Model)、`SAX`(Simple API for XML)或`StAX`(Streaming API for XML)。DOM一次性加载整个文档到内存,适合小到中型的XML文件;SAX是事件驱动的,逐行读取,适合大文件;...
### 详解Java解析XML的四种方法 #### 一、引言 XML(可扩展标记语言)作为一种跨平台、跨语言的数据交换格式,在多种场景中扮演着重要的角色。它以其平台无关性、语言无关性和系统无关性的特点,在数据集成与交互...
在这个主题中,我们将深入探讨如何在Android环境中使用Dom4J库来解析XML文件。 首先,我们需要了解XML的基本结构。XML(eXtensible Markup Language)是一种标记语言,通过标签(Tags)定义元素(Elements),元素...
### Dom4j解析XML及其中文问题解决 #### 一、Dom4j简介 Dom4j是一种用于处理XML的Java库,它提供了一种简洁而强大的API来读取、写入和操作XML数据。自2001年首次发布以来,Dom4j因其直观的接口和高效的性能而在...