`

Java_解析XML的四种方法

    博客分类:
  • Java
 
阅读更多

from: http://developer.51cto.com/art/200903/117512.htm

 

XML在不同的语言里解析方式都是一样的,只不过实现的语法不同而已。基本的解析方式有两种,一种叫SAX,另一种叫DOM。SAX是基于事件流的解析,DOM是基于XML文档树结构的解析。假设我们XML的内容和结构如下:

<?xml version="1.0" encoding="UTF-8"?> 
<employees>
<employee>
<name>ddviplinux</name>
<sex>m</sex>
<age>30</age>
</employee>
</employees>

本文使用JAVA语言来实现DOM与SAX的XML文档生成与解析。 
首先定义一个操作XML文档的接口XmlDocument 它定义了XML文档的建立与解析的接口。

/** 
* 定义XML文档建立与解析的接口 */
public interface XmlDocument {
/**
* 建立XML文档
* @param fileName 文件全路径名称
*/
public void createXml(String fileName);
/**
* 解析XML文档
* @param fileName 文件全路径名称
*/
public void parserXml(String fileName);
}

1.DOM生成和解析XML文档

为 XML 文档的已解析版本定义了一组接口。解析器读入整个文档,然后构建一个驻留内存的树结构,然后代码就可以使用 DOM 接口来操作这个树结构。优点:整个文档树在内存中,便于操作;支持删除、修改、重新排列等多种功能;缺点:将整个文档调入内存(包括无用的节点),浪费时间和空间;使用场合:一旦解析了文档还需多次访问这些数据;硬件资源充足(内存、CPU)。

/** 

* DOM生成与解析XML文档 

*/ 

public class DomDemo implements XmlDocument { 

private Document document; 

private String fileName; 

public void init() { 

try { 

DocumentBuilderFactory factory = DocumentBuilderFactory .newInstance(); 

DocumentBuilder builder = factory.newDocumentBuilder(); 

this.document = builder.newDocument(); 

} catch (ParserConfigurationException e) { 

System.out.println(e.getMessage()); 

public void createXml(String fileName) { 

Element root = this.document.createElement("employees"); 

this.document.appendChild(root); 

Element employee = this.document.createElement("employee"); 

Element name = this.document.createElement("name"); 

name.appendChild(this.document.createTextNode("丁宏亮")); 

employee.appendChild(name); 

Element sex = this.document.createElement("sex"); 

sex.appendChild(this.document.createTextNode("m")); 

employee.appendChild(sex); 

Element age = this.document.createElement("age"); 

age.appendChild(this.document.createTextNode("30")); 

employee.appendChild(age); 

root.appendChild(employee); 

TransformerFactory tf = TransformerFactory.newInstance(); 

try { 

Transformer transformer = tf.newTransformer(); 

DOMSource source = new DOMSource(document); 

transformer.setOutputProperty(OutputKeys.ENCODING, "gb2312"); 

transformer.setOutputProperty(OutputKeys.INDENT, "yes"); 

PrintWriter pw = new PrintWriter(new FileOutputStream(fileName)); 

StreamResult result = new StreamResult(pw); 

transformer.transform(source, result); 

System.out.println("生成XML文件成功!"); 

} catch (TransformerConfigurationException e) { 

System.out.println(e.getMessage()); 

} catch (IllegalArgumentException e) { 

System.out.println(e.getMessage()); 

} catch (FileNotFoundException e) { 

System.out.println(e.getMessage()); 

} catch (TransformerException e) { 

System.out.println(e.getMessage()); 

public void parserXml(String fileName) { 

try { 

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 

DocumentBuilder db = dbf.newDocumentBuilder(); 

Document document = db.parse(fileName); 

NodeList employees = document.getChildNodes(); 

for (int i = 0; i < employees.getLength(); i++) { 

Node employee = employees.item(i); 

NodeList employeeInfo = employee.getChildNodes(); 

for (int j = 0; j < employeeInfo.getLength(); j++) { 

Node node = employeeInfo.item(j); 

NodeList employeeMeta = node.getChildNodes(); 

for (int k = 0; k < employeeMeta.getLength(); k++) { 

System.out.println(employeeMeta.item(k).getNodeName() + ":" + employeeMeta.item(k).getTextContent()); 

System.out.println("解析完毕"); 

} catch (FileNotFoundException e) { 

System.out.println(e.getMessage()); 

} catch (ParserConfigurationException e) { 

System.out.println(e.getMessage()); 

} catch (SAXException e) { 

System.out.println(e.getMessage()); 

} catch (IOException e) { 

System.out.println(e.getMessage()); 

 

2.SAX生成和解析XML文档

为解决DOM的问题,出现了SAX。SAX ,事件驱动。当解析器发现元素开始、元素结束、文本、文档的开始或结束等时,发送事件,程序员编写响应这些事件的代码,保存数据。优点:不用事先调入整个文档,占用资源少;SAX解析器代码比DOM解析器代码小,适于Applet,下载。缺点:不是持久的;事件过后,若没保存数据,那么数据就丢了;无状态性;从事件中只能得到文本,但不知该文本属于哪个元素;使用场合:Applet;只需XML文档的少量内容,很少回头访问;机器内存少;

/**  

* SAX文档解析  

*/  

public class SaxDemo implements XmlDocument {   

 

public void createXml(String fileName) {   

System.out.println("<<"+filename+">>");   

}   

 

public void parserXml(String fileName) {   

SAXParserFactory saxfac = SAXParserFactory.newInstance();   

 

try {

SAXParser saxparser = saxfac.newSAXParser();   

InputStream is = new FileInputStream(fileName);   

saxparser.parse(is, new MySAXHandler());   

} catch (ParserConfigurationException e) {   

e.printStackTrace();   

} catch (SAXException e) {   

e.printStackTrace();   

} catch (FileNotFoundException e) {   

e.printStackTrace();   

} catch (IOException e) {   

e.printStackTrace();   

}   

}   

}   

 

class MySAXHandler extends DefaultHandler {   

 

boolean hasAttribute = false;   

Attributes attributes = null;   

public void startDocument() throws SAXException {   

System.out.println("文档开始打印了");   

}   

public void endDocument() throws SAXException {   

System.out.println("文档打印结束了");   

}   

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

if (qName.equals("employees")) {   

return;   

}   

if (qName.equals("employee")) {   

System.out.println(qName);   

}   

if (attributes.getLength() > 0) {   

this.attributes = attributes;   

this.hasAttribute = true;   

}   

}   

 

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

if (hasAttribute && (attributes != null)) {   

for (int i = 0; i < attributes.getLength(); i++) {   

System.out.println(attributes.getQName(0) + attributes.getValue(0));   

}   

}   

}   

 

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

System.out.println(new String(ch, start, length));   

}  

}  

 

3.DOM4J生成和解析XML文档

DOM4J 是一个非常非常优秀的Java XML API,具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件。如今你可以看到越来越多的 Java 软件都在使用 DOM4J 来读写 XML,特别值得一提的是连 Sun 的 JAXM 也在用 DOM4J。

/**  

* Dom4j 生成XML文档与解析XML文档  

*/  

public class Dom4jDemo implements XmlDocument {   

 

public void createXml(String fileName) {   

Document document = DocumentHelper.createDocument();   

Element employees=document.addElement("employees");   

Element employee=employees.addElement("employee");   

Element name= employee.addElement("name");   

name.setText("ddvip");   

Element sex=employee.addElement("sex");   

sex.setText("m");   

Element age=employee.addElement("age");   

age.setText("29");   

try {   

Writer fileWriter=new FileWriter(fileName);   

XMLWriter xmlWriter=new XMLWriter(fileWriter);   

xmlWriter.write(document);   

xmlWriter.close();   

} catch (IOException e) {   

System.out.println(e.getMessage());   

}   

}   

 

 

public void parserXml(String fileName) {   

File inputXml=new File(fileName);   

SAXReader saxReader = new SAXReader();   

try {   

Document document = saxReader.read(inputXml);   

Element employees=document.getRootElement();   

for(Iterator i = employees.elementIterator(); i.hasNext();){   

Element employee = (Element) i.next();   

for(Iterator j = employee.elementIterator(); j.hasNext();){   

Element node=(Element) j.next();   

System.out.println(node.getName()+":"+node.getText());   

}   

}   

} catch (DocumentException e) {   

System.out.println(e.getMessage());   

}   

System.out.println("dom4j parserXml");   

}   

 

4.JDOM生成和解析XML  

为减少DOM、SAX的编码量,出现了JDOM;优点:20-80原则,极大减少了代码量。使用场合:要实现的功能简单,如解析、创建等,但在底层,JDOM还是使用SAX(最常用)、DOM、Xanan文档。

/**  

* JDOM 生成与解析XML文档  

*   

*/  

public class JDomDemo implements XmlDocument {   

 

public void createXml(String fileName) {   

Document document;   

Element  root;   

root=new Element("employees");   

document=new Document(root);   

Element employee=new Element("employee");   

root.addContent(employee);   

Element name=new Element("name");   

name.setText("ddvip");   

employee.addContent(name);   

Element sex=new Element("sex");   

sex.setText("m");   

employee.addContent(sex);   

Element age=new Element("age");   

age.setText("23");   

employee.addContent(age);   

XMLOutputter XMLOut = new XMLOutputter();   

try {   

XMLOut.output(document, new FileOutputStream(fileName));   

} catch (FileNotFoundException e) {   

e.printStackTrace();   

} catch (IOException e) {   

e.printStackTrace();   

}   

 

}   

 

public void parserXml(String fileName) {   

SAXBuilder builder=new SAXBuilder(false);    

try {   

Document document=builder.build(fileName);   

Element employees=document.getRootElement();    

List employeeList=employees.getChildren("employee");   

for(int i=0;iElement employee=(Element)employeeList.get(i);   

List employeeInfo=employee.getChildren();   

for(int j=0;jSystem.out.println(((Element)employeeInfo.get(j)).getName()+":"+((Element)employeeInfo.get(j)).getValue());   

}   

}   

} catch (JDOMException e) {   

e.printStackTrace();   

} catch (IOException e) {   

e.printStackTrace();   

}    

}   

}

 

分享到:
评论

相关推荐

    DOM_XML.rar_DOM_dom xml_dom xml java_dom解析xml_java解析xml

    标题中的"DOM_XML.rar"可能是一个包含DOM解析XML相关示例的压缩文件,"DOM_dom xml_dom xml java_dom解析xml_java解析xml"这部分描述了文件的主要内容,即关于DOM(Document Object Model)在XML解析中的应用,特别...

    XML.rar_XML SAX_XML java_dom xml_java xml_java解析xml

    - 解析XML文件:调用`parse()`方法解析XML文件,返回一个`Document`对象。 - 访问XML数据:通过`Document`对象的`getElementsByTagName()`、`getFirstChild()`等方法遍历并获取元素、属性和文本。 2. SAX解析: SAX...

    JavaXml.zip_java xml_javaXML_java解析xml_文档解析

    在Java中,有多种方式可以解析XML文档,包括DOM(Document Object Model)、SAX(Simple API for XML)和StAX(Streaming API for XML)。下面我们将详细探讨这些解析方法以及相关的API。 1. DOM解析器:DOM解析器...

    XML.rar_java xml_xml_解析xml

    总结来说,Java中解析XML有两种主要方法:DOM和SAX。DOM解析适合小到中型的XML文件,提供完整的文档结构,方便操作;而SAX解析适用于大型XML文件,以事件驱动的方式节省内存。选择哪种解析方式取决于应用的需求和...

    java_dom解析xml xml java

    标题“java_dom解析xml xml java”表明了本文档的主题是关于如何使用Java中的DOM技术来解析XML文件。 #### 描述分析 描述中提到这是一个适合新手入门的内容,并给出了一个简单的XML示例。该XML文档包含了一个`...

    java在线解析xmljava在线解析xmljava在线解析xmljava在线解析xml

    java在线解析xmljava在线解析xmljava在线解析xmljava在线解析xmljava在线解析xmljava在线解析xmljava在线解析xmljava在线解析xmljava在线解析xmljava在线解析xmljava在线解析xmljava在线解析xmljava在线解析xmljava...

    XML.rar_XML java_java call_java xml_xml 读写_xml读写 java

    使用DOM解析器,可以创建DocumentBuilder实例,然后使用parse()方法解析XML文件得到Document对象,再通过getElementsByTagname()等方法获取元素,最后用Transformer进行序列化写出。使用SAX解析器,需要创建...

    java xml解析工具类 java xml解析工具类

    java xml解析工具类 java xml解析工具类java xml解析工具类 java xml解析工具类java xml解析工具类 java xml解析工具类java xml解析工具类 java xml解析工具类java xml解析工具类 java xml解析工具类java xml解析...

    Java-xml.rar_XML java_java xml_javaXML.rar_javaxml.r_xml 网站

    Java和XML是两种在软件开发中广泛使用的技术,它们在构建动态网站方面有着重要的结合。XML(eXtensible Markup Language)是一种数据交换格式,它允许数据以结构化的方式存储和传输,而Java则是一种多用途的编程语言...

    Java 解析 xml 3种方法

    在Java中,有多种方式来解析XML,主要包括SAX、JDOM和DOM4J。下面我们将详细介绍这三种方法。 1. SAX(Simple API for XML) SAX是一种基于事件驱动的解析器,它不会一次性加载整个XML文档到内存,而是逐行读取,当...

    java_xml.rar_java xml_sax_xml_xml ja_操作 xml

    在给定的压缩包中,可能包含了使用DOM和SAX解析XML的Java代码示例。`www.pudn.com.txt`可能是一个文本文件,包含了有关这些示例的介绍或链接。`SAMPLE`可能是代码样例,展示如何在实际项目中应用DOM和SAX解析XML。 ...

    Java_XML生成与解析的四种方法

    ### Java中XML生成与解析的四种方法 #### 一、概述 XML(可扩展标记语言)作为一种跨平台、跨语言的数据交换格式,在数据集成与交互领域具有重要作用。它以其平台无关性、语言无关性和系统无关性的特点,在软件开发...

    详解Java解析XML的四种方法

    本文将深入探讨Java解析XML的四种主要方法。 1. DOM(Document Object Model)解析: DOM解析器将整个XML文档加载到内存中,创建一个树形结构,允许开发者通过节点遍历和操作XML。例如,Java的`javax.xml.parsers....

    Java与XML联合编程之DOM篇.rar_dom xml_dom xml java_java xml

    本教程将深入探讨Java中使用DOM模型解析XML文件的方法。 首先,我们需要了解DOM的基本概念。DOM将XML文档视为一个节点树,其中根节点代表整个文档,其他节点则表示文档的各种元素、属性、文本等。通过DOM API,我们...

    java解析xml的四种经典方法

    Java解析XML的四种经典方法是XML处理中常用的技术,它们分别是DOM、SAX、StAX和JDOM。每种方法都有其独特的特性和适用场景,下面将详细介绍这四种方法。 1. DOM(Document Object Model)解析: DOM是W3C制定的一种...

    Java解析XML的四种方法比较

    Java解析XML时,主要有四种方法:DOM(Document Object Model)、SAX(Simple API for XML)、StAX(Streaming API for XML)以及JAXB(Java Architecture for XML Binding)。这四种方法各有特点,适用于不同的场景...

    XML-java.rar_XML SAX_sax_sax xml_sax 解析 xml_xml using dom

    本压缩包文件“XML-java.rar”包含了关于使用Java解析XML的实例,特别强调了SAX解析器的使用,并且提到了使用JDOM和JOM4J这两个Java库来处理XML。 1. **DOM解析**:DOM是一种树型结构,它将整个XML文档加载到内存中...

    java_xml_pack-summer02_01.zip_XML java_document XML API_java xm

    1. **解析XML**:选择合适的API,如使用DOM的`DocumentBuilder.parse()`方法解析XML文件,或者使用SAX的`XMLReader.parse()`方法。 2. **遍历和操作XML**:使用DOM,可以通过`NodeList`和`Node`接口来访问和修改XML...

    xml.rar_j2me_j2me xml_java xml_xml j2me

    标题"xml.rar_j2me_j2me_xml_java_xml_j2me"暗示了这是一个针对J2ME平台的XML处理解决方案,可能包含轻量级的解析器和示例应用。 描述中提到的"j2me上的微型解析器"指的是专为J2ME设计的XML解析库,旨在在内存有限...

    Java解析XML四种方式

    总结,Java解析XML的方式多样,每种都有其适用场景。理解这些方法的原理和优缺点,能够帮助开发者根据项目需求选择最佳实践。在实际工作中,可以结合使用这些解析技术,以实现更高效、更安全的XML处理。

Global site tag (gtag.js) - Google Analytics