`
rogerhunt
  • 浏览: 57749 次
  • 性别: Icon_minigender_1
  • 来自: 新加坡
社区版块
存档分类
最新评论

怎样用Java读取XML文件--(Dom解析器)

 
阅读更多
在这篇文章里,你将看到怎样用DOM XML解析器读取XML文件。DOM解析器解析整个XML文件并把它加载到内存中;然后模式化为一个树结构以便于便利或操作。

总之,就是把转换成了一个DOM对象或者树结构,并且必须一个节点一个节点地遍历以取得你想要的节点。

引用

什么是节点(Node)?
对DOM来说,XML里的所有东西都可以看作一个节点,请查看


引用

警告
当DOM加载一个含有大量数据的XML文档时,速度缓慢并且消费大量的内存。请考虑使用SAX解析器替代,SAX比DOM更快并且使用更少内存。


1.DOM XML解析器例子

通过这个例子你将知道如何通过"name"取得节点,并且显示值。

Users/tongxiqing/staff.xml

<?xml version="1.0" encoding="UTF-8"?>
<company>
	<staff id="1001">
		<firstname>政</firstname>
		<lastname>赢</lastname>
		<nickname>秦始皇</nickname>
		<salary>100000</salary>
	</staff>
	<staff id="2001">
		<firstname>邦</firstname>
		<lastname>刘</lastname>
		<nickname>汉高祖</nickname>
		<salary>200000</salary>
	</staff>
</company>


ReadXMLFile.java

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.mkyong.seo;

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.w3c.dom.Node;
import org.w3c.dom.Element;
import java.io.File;

/**
 *
 * @author Administrator
 */
public class ReadXMLFile {
  public static void main(String argv[]) {
 
    try {
 
	File fXmlFile = new File("src/Users/tongxiqing/staff.xml");
	DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
	DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
	Document doc = dBuilder.parse(fXmlFile);
 
	//optional, but recommended
	//read this - http://stackoverflow.com/questions/13786607/normalization-in-dom-parsing-with-java-how-does-it-work
	doc.getDocumentElement().normalize();
 
	System.out.println("根节点 :" + doc.getDocumentElement().getNodeName());
 
	NodeList nList = doc.getElementsByTagName("staff");
 
	System.out.println("----------------------------");
 
	for (int temp = 0; temp < nList.getLength(); temp++) {
 
		Node nNode = nList.item(temp);
 
		System.out.println("\n当前节点 :" + nNode.getNodeName());
 
		if (nNode.getNodeType() == Node.ELEMENT_NODE) {
 
			Element eElement = (Element) nNode;
 
			System.out.println("职工号 : " + eElement.getAttribute("id"));
			System.out.println("名 : " + eElement.getElementsByTagName("firstname").item(0).getTextContent());
			System.out.println("姓 : " + eElement.getElementsByTagName("lastname").item(0).getTextContent());
			System.out.println("号 : " + eElement.getElementsByTagName("nickname").item(0).getTextContent());
			System.out.println("俸禄 : " + eElement.getElementsByTagName("salary").item(0).getTextContent());
 
		}
	}
    } catch (Exception e) {
	e.printStackTrace();
    }
  }  
}


结果
run:
根节点 :company
----------------------------

当前节点 :staff
职工号 : 1001
名 : 政
姓 : 赢
号 : 秦始皇
俸禄 : 100000

当前节点 :staff
职工号 : 2001
名 : 邦
姓 : 刘
号 : 汉高祖
俸禄 : 200000
成功构建 (总时间: 0 秒)


2. 循环遍历节点
本例子读取“staff1.xml“文件,并且你将看到如何一个一个地遍历节点,同时输出名字和值,如果有属性的话还可以输出属性。

Users/tongxiqing/staff1.xml

<?xml version="1.0" encoding="UTF-8"?>
<公司>
	<职员 编号="1001">
		<姓>政</姓>
		<名>赢</名>
		<号>秦始皇</号>
		<俸禄>100000</俸禄>
	</职员>
	<职员 编号="2001">
		<姓>邦</姓>
		<名>刘</名>
		<号>汉高祖</号>
		<俸禄>200000</俸禄>
	</职员>
</公司>



ReadXMLFile2.java

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.mkyong.seo;

import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

/**
 *
 * @author Administrator
 */
public class ReadXMLFile2 {
    
  public static void main(String[] args) {
 
    try {
 
	File file = new File("src/Users/tongxiqing/staff1.xml");
 
	DocumentBuilder dBuilder = DocumentBuilderFactory.newInstance()
                             .newDocumentBuilder();
 
	Document doc = dBuilder.parse(file);
 
	System.out.println("根节点 :" + doc.getDocumentElement().getNodeName());
 
	if (doc.hasChildNodes()) {
 
		printNote(doc.getChildNodes());
 
	}
 
    } catch (Exception e) {
	System.out.println(e.getMessage());
    }
 
  }
 
  private static void printNote(NodeList nodeList) {
 
    for (int count = 0; count < nodeList.getLength(); count++) {
 
	Node tempNode = nodeList.item(count);
 
	// make sure it's element node.
	if (tempNode.getNodeType() == Node.ELEMENT_NODE) {
 
		// get node name and value
		System.out.println("\n节点名字 =" + tempNode.getNodeName() + " [OPEN]");
		System.out.println("节点值 =" + tempNode.getTextContent());
 
		if (tempNode.hasAttributes()) {
 
			// get attributes names and values
			NamedNodeMap nodeMap = tempNode.getAttributes();
 
			for (int i = 0; i < nodeMap.getLength(); i++) {
 
				Node node = nodeMap.item(i);
				System.out.println("属性名字 : " + node.getNodeName());
				System.out.println("属性值 : " + node.getNodeValue());
 
			}
 
		}
 
		if (tempNode.hasChildNodes()) {
 
			// loop again if has child nodes
			printNote(tempNode.getChildNodes());
 
		}
 
		System.out.println("节点名字 =" + tempNode.getNodeName() + " [CLOSE]");
 
	}
 
    }
 
  }    
    
}


结果
run:
根节点 :公司

节点名字 =公司 [OPEN]
节点值 =
	
		政
		赢
		秦始皇
		100000
	
	
		邦
		刘
		汉高祖
		200000
	


节点名字 =职员 [OPEN]
节点值 =
		政
		赢
		秦始皇
		100000
	
属性名字 : 编号
属性值 : 1001

节点名字 =姓 [OPEN]
节点值 =政
节点名字 =姓 [CLOSE]

节点名字 =名 [OPEN]
节点值 =赢
节点名字 =名 [CLOSE]

节点名字 =号 [OPEN]
节点值 =秦始皇
节点名字 =号 [CLOSE]

节点名字 =俸禄 [OPEN]
节点值 =100000
节点名字 =俸禄 [CLOSE]
节点名字 =职员 [CLOSE]

节点名字 =职员 [OPEN]
节点值 =
		邦
		刘
		汉高祖
		200000
	
属性名字 : 编号
属性值 : 2001

节点名字 =姓 [OPEN]
节点值 =邦
节点名字 =姓 [CLOSE]

节点名字 =名 [OPEN]
节点值 =刘
节点名字 =名 [CLOSE]

节点名字 =号 [OPEN]
节点值 =汉高祖
节点名字 =号 [CLOSE]

节点名字 =俸禄 [OPEN]
节点值 =200000
节点名字 =俸禄 [CLOSE]
节点名字 =职员 [CLOSE]
节点名字 =公司 [CLOSE]
成功构建 (总时间: 0 秒)
分享到:
评论

相关推荐

    XML解析工具

    读取和设置xml配置文件是最常用的操作,试用了几个C++的XML解析器,个人感觉TinyXML是使用起来最舒服的,因为它的API接口和Java的十分类似,面向对象性很好。 TinyXML是一个开源的解析XML的解析库,能够用于C++,...

    XML DOM技术的设计

    掌握DOM解析器,包括创建DOM解析器的步骤;Doucument对象的结构。节点的类型,包括Node接口;Node 接口的常用方法;节点的子孙关系。各节点的实例,包括element节点 、Text节点、 Attr节点 、 DocumentType节点、 ...

    java解析xml及4种常用解析比较

    然而由于使用DOM解析器的时候需要处理整个XML文档,所以对性能和内存的要求比较高,尤其是遇到很大的XML文件的时候。由于它的遍历能力,DOM解析器常用于XML文档需要频繁的改变的服务中。 SAX解析器采用了基于事件的...

    TinyXML 解析器

    读取和设置xml配置文件是最常用的操作,试用了几个C++的XML解析器,个人感觉TinyXML是使用起来最舒服的,因为它的API接口和Java的十分类似,面向对象性很好。 TinyXML是一个开源的解析XML的解析库,能够用于C++,...

    J2EE中XML配置文件的读取处理

    有好几种XML解析器:主要有DOM和SAX,在apache的XML项目组中,目前有Xerces Xalan Cocoon几个开发XML相关技术的project.Tomcat本身使用的是Sun的JAXP,而其XSL Taglib project中使用Xerces解析器。

    Android中使用pull解析器操作xml文件的解决办法

    一、使用Pull解析器读取XML文件 除了可以使用SAX或DOM解析XML文件之外,大家也可以使用Android内置的Pull解析器解析XML文件。 Pull解析器是一个开源的java项目,既可以用于android,也可以用于JavaEE。如果用在...

    XML解析教程

    java解析xml四种方式 DOM (Document Object Model, 即文档对象模型) 是 W3C 组织推荐的处理 XML 的标准接口, DOM采用建立树形...目前许多开源项目中大量采用DOM4J,例如大名鼎鼎的Hibernate也用DOM4J来读取XML配置文件.

    PULL解析xml的demo

    通用性强,它会将XML文件的所有内容读取到内存中,然后使用DOM API遍历XML树、检索所需的数据; 优点:简单直观,但需要将文档读取到内存, 缺点:并不太适合移动设备; 2,SAX SAX是一个解析速度快并且占用内存少的...

    JAVA_API1.6文档(中文)

    javax.xml.bind.annotation.adapters XmlAdapter 及其规范定义的子类允许任意 Java 类与 JAXB 一起使用。 javax.xml.bind.attachment 此包由基于 MIME 的包处理器实现,该处理器能够解释并创建基于 MIME 的包格式的...

    XML轻松学习手册--XML肯定是未来的发展趋势,不论是网页设计师还是网络程序员,都应该及时学习和了解

     好了,通过第三章的学习,我们已经了解了一些XML和DTD的基本术语,但是我们还不知道怎样来写这些文件,需要遵循什么样的语法,在下一章,将重点介绍有关撰写XML和DTD文档的语法。 第四章 XML语法 七.DTD的语法...

    java轻量级的xml解析jar

    一个轻量级的xml解析器,完全原创,没有dom,也没有sax,只有15K的jar包。应用方便,简单。支持读取xml文档,修改xml文档,写入xml文档。

    TinyXml静态库+演示代码

    读取和设置xml配置文件是最常用的操作,试用了几个C++的XML解析器,个人感觉TinyXML是使用起来最舒服的,因为它的API接口和Java的十分类似,面向对象性很好。 TinyXML是一个开源的解析XML的解析库,能够用于C++,...

    xml入门教程/xml入门教程

    DTD不支持命名空间,解析器无法测试命名空间。 1、作用: 解决XML文档中命名冲突的问题,即将 XML文档与引用URI标识的名域相结合,来 限定其中的元素和属性名。 示例: &lt;?xml version="1.0" encoding="UTF-8" ...

    tinyxml 常用的C++ XML解析器非常优秀

    读取和设置xml配置文件是最常用的操作,试用了几个C++的XML解析器,个人感觉TinyXML是使用起来最舒服的,因为它的API接口和Java的十分类似,面向对象性很好。 TinyXML是一个开源的解析XML的解析库,能够用于C++,...

    JDOM(java)使用详解及实例

    这些不足之处主要在于SAX没有文档修改、随机访问以及输出的功能,而对于DOM来说,JAVA程序员在使用时来用起来总觉得不太方便。 DOM的缺点主要是来自于由于Dom是一个接口定义语言(IDL),它的任务是在不同语言实现中...

    Android程序技术:个人学习助手项目习题详情显示.pptx

    逐行扫描XML文件,读取文件的同时即可进行解析处理,不必等到文件加载结束。缺点是无法进行增、删、改等操作。 SAX解析 一个开源的Java项目,既可以用于Android应用,也可以用于JavaEE程序。Android中已经集成了PULL...

    DWR.xml配置文件说明书(含源码)

    DWR.xml配置文件说明书 1、 建立dwr.xml 配置文件 任何一个dwr.xml的文件都需要包含DWR DOCTYPE的声明行,格式如下: &lt;!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN" ...

    jdom1.1.3xml解析工具类

    org.jdom包含了所有的xml文档要素的java类 org.jdom.adapters包含了与dom适配的java类 org.jdom.filter包含了xml文档的过滤器类 org.jdom.input包含了读取xml文档的类 org.jdom.output包含了写入xml文档的类 org....

    apache-commons源码及jar文件

    Commons-Digester 是一个 XML-Java对象的映射工具,用于解析 XML配置文件. Discovery Commons-Discovery 提供工具来定位资源 (包括类) ,通过使用各种模式来映射服务/引用名称和资源名称。. EL Commons-EL 提供在...

    Java 1.6 API 中文 New

    javax.xml.bind.annotation.adapters XmlAdapter 及其规范定义的子类允许任意 Java 类与 JAXB 一起使用。 javax.xml.bind.attachment 此包由基于 MIME 的包处理器实现,该处理器能够解释并创建基于 MIME 的包格式的...

Global site tag (gtag.js) - Google Analytics