欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程语言 > java >内容正文

java

java怎么xml文件解析_Java对Xml文件解析

发布时间:2025/4/5 java 34 豆豆
生活随笔 收集整理的这篇文章主要介绍了 java怎么xml文件解析_Java对Xml文件解析 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

JAVA 解析 XML 通常有两种方式,DOM 和 SAX。

DOM 虽然是 W3C 的标准,提供了标准的解析方式,但它的解析效率一直不尽如人意,因为使用DOM解析XML时,解析器读入整个文档并构建一个驻留内存的树结构(节点树),然后您的代码才可以使用 DOM 的标准接口来操作这个树结构。但大部分情况下我们只对文档的部分内容感兴趣,根本就不用先解析整个文档,并且从节点树的根节点来索引一些我们需要的数据也是非常耗时的。

SAX是一种XML解析的替代方法。相比于文档对象模型DOM,SAX 是读取和操作 XML 数据的更快速、更轻量的方

法。SAX 允许您在读取文档时处理它,从而不必等待整个文档被存储之后才采取操作。它不涉及 DOM 所必需的开销和概念跳跃。 SAX API是一个基于事件的API ,适用于处理数据流,即随着数据的流动而依次处理数据。SAX API 在其解析您的文档时发生一定事件的时候会通知您。在您对其响应时,您不作保存的数据将会 被抛弃。

1. Xml技术简介Xml文件有两种约束类型,包括文档类型定义(DTD)和Xml 模式(Schema)。Xml DTD被包含在xml1的标准里。Xml 模式被包含在W3C的标准中。在xml 数据和xml 模式两者之间有很多的区别。

A. xml模式支持的数据类型比xml DTD多;

B. xml模式在无序的情况下使用起来比xml DTD更方便;

C. xml模式支持名字空间,可以在不同的文件中定义相同的方法等。

D. xml模式形成的文档可以被多种标准解析,如dom,sax或者jdom等,而xml DTD方式下确不行。

2. Xml文件解析

在java语言环境里可以使用三种方法解析xml文件:dom(document object model),sax(simple api for xml)和jdom(java document object model)。

SAX提供了基于事件的方式进行解析,适合于快速,数据量小的解析情况。SAX解析有几个缺陷:A.它的解析是连续的;B.数据无法回朔。

DOM解析不同于SAX。它提供了内存中完整的xml数据映像,数据被存储在树状结构中。DOM解析方式更容易获得和处理数据。

JDOM是java语言中特有的,主要用来支持xpath标准。

3. SAX解析方式

上面我简要介绍了几种解析xml文件的技术,这里我们使用SAX技术给出一个小例子,大家可以从这个例子中发现如果你能够掌握一些开源软件包,你就可以很快掌握解析xml数据的技术。

3.1制作一个简单的xml文件component.xml

1

3.2下载xerces.jar软件包

在Apache网站上×××下载xerces.jar软件包,这个包中包含了上面我们列举的几种解析xml数据的API。然后将这个软件包加入到程序的 classpath中。

3.3制作解析类MySaxParser.java

import java.io.IOException;

import org.xml.sax.*;

import org.xml.sax.helpers.*;

import javax.xml.parsers.*;

public class MySaxParser extends DefaultHandler {

private static int INDENT = 2;

// 运行主方法

public static void main(String[] argv) {

// if (argv.length != 1) {

// System.out.println("Usage: java ds.MySaxParser [URI]");

// System.exit(0);

// }

System.setProperty("javax.xml.parsers.SAXParserFactory", "org.apache.xerces.jaxp.SAXParserFactoryImpl");

// String uri = argv[0];

String uri = "Components.xml";

try {

SAXParserFactory parserFactory = SAXParserFactory.newInstance();

parserFactory.setValidating(false);

parserFactory.setNamespaceAware(false);

MySaxParser MySaxParserInstance = new MySaxParser();

SAXParser parser = parserFactory.newSAXParser();

parser.parse(uri, MySaxParserInstance);

}

catch (IOException ex) {

ex.printStackTrace();

}

catch (SAXException ex) {

ex.printStackTrace();

}

catch (ParserConfigurationException ex) {

ex.printStackTrace();

}

catch (FactoryConfigurationError ex) {

ex.printStackTrace();

}

}

private int idx = 0; // indent

// 处理各种分隔符号

public void characters(char[] ch, int start, int length) throws SAXException {

// instantiates s, indents output, prints character values in element

String s = new String(ch, start, length);

if (!s.startsWith("\n")) // 空的value不打印

System.out.println(getIndent() + " Value: " + s);

}

// 处理文档尾

public void endDocument() throws SAXException {

idx -= INDENT;

System.out.println(getIndent() + "end document");

System.out.println("...PARSING ends");

}

// 处理标记尾

public void endElement(String uri, String localName, String qName) throws SAXException {

idx -= INDENT;

}

// 处理文档的起始点

public void startDocument() throws SAXException {

idx += INDENT;

System.out.println("PARSING begins...");

System.out.println(getIndent() + "start document: ");

}

// 处理标记头

public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {

idx += INDENT;

System.out.println('\n' + getIndent() + "start element: " + qName);

}

private String getIndent() {

StringBuffer sb = new StringBuffer();

for (int i = 0; i < idx; i++)

sb.append(" ");

return sb.toString();

}

} 总结,虽然解析xml数据很复杂,因为涉及了很多的递归算法,但是我们可以使用业界比较成熟的解析API来进行xml数据处理。我现在只是给出了一个非常简单的例子,但是在真实系统中远比这个要复杂的多,大家以后在使用的使用会发现还是有很多的工作要做的。

《新程序员》:云原生和全面数字化实践50位技术专家共同创作,文字、视频、音频交互阅读

总结

以上是生活随笔为你收集整理的java怎么xml文件解析_Java对Xml文件解析的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。