xml--通过DOM解析XML
此文章通过3个例子表示DOM方式解析XML的用法。
通过DOM解析XML必须要写的3行代码.
step 1: 获得dom解析器工厂(工作的作用是用于创建具体的解析器)
step 2:获得具体的dom解析器
step 3: 解析一个xml文档,获得Document对象(根结点)
第一个例子通过简单的名称,取出对应元素的值。
例子1:
package com.text.tool; import java.io.File; import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList; public class DomTest1 {
public static void main(String[] args) throws Exception {
// step 1: 获得dom解析器工厂(工作的作用是用于创建具体的解析器)
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); // System.out.println("class name: " + dbf.getClass().getName()); // step 2:获得具体的dom解析器
DocumentBuilder db = dbf.newDocumentBuilder(); // System.out.println("class name: " + db.getClass().getName()); // step3: 解析一个xml文档,获得Document对象(根结点)
Document document = db.parse(new File("candidate.xml")); NodeList list = document.getElementsByTagName("PERSON"); for (int i = 0; i < list.getLength(); i++) {
Element element = (Element) list.item(i); String content = element.getElementsByTagName("NAME").item(0)
.getFirstChild().getNodeValue(); System.out.println("name:" + content); content = element.getElementsByTagName("ADDRESS").item(0)
.getFirstChild().getNodeValue(); System.out.println("address:" + content); content = element.getElementsByTagName("TEL").item(0)
.getFirstChild().getNodeValue(); System.out.println("tel:" + content); content = element.getElementsByTagName("FAX").item(0)
.getFirstChild().getNodeValue(); System.out.println("fax:" + content); content = element.getElementsByTagName("EMAIL").item(0)
.getFirstChild().getNodeValue(); System.out.println("email:" + content); System.out.println("--------------------------------------");
}
}
}
xml:
注意以下的xml内容要放到工程的根目录下,不要放在src目录下
<?xml version="1.0"?>
<PEOPLE>
<PERSON PERSONID="E01">
<NAME>Tony Blair</NAME>
<ADDRESS>10 Downing Street, London, UK</ADDRESS>
<TEL>(061) 98765</TEL>
<FAX>(061) 98765</FAX>
<EMAIL>blair@everywhere.com</EMAIL>
</PERSON>
<PERSON PERSONID="E02">
<NAME>Bill Clinton</NAME>
<ADDRESS>White House, USA</ADDRESS>
<TEL>(001) 6400 98765</TEL>
<FAX>(001) 6400 98765</FAX>
<EMAIL>bill@everywhere.com</EMAIL>
</PERSON>
<PERSON PERSONID="E03">
<NAME>Tom Cruise</NAME>
<ADDRESS>57 Jumbo Street, New York, USA</ADDRESS>
<TEL>(001) 4500 67859</TEL>
<FAX>(001) 4500 67859</FAX>
<EMAIL>cruise@everywhere.com</EMAIL>
</PERSON>
<PERSON PERSONID="E04">
<NAME>Linda Goodman</NAME>
<ADDRESS>78 Crax Lane, London, UK</ADDRESS>
<TEL>(061) 54 56789</TEL>
<FAX>(061) 54 56789</FAX>
<EMAIL>linda@everywhere.com</EMAIL>
</PERSON>
</PEOPLE>
运行结果:
name:Tony Blair
address:10 Downing Street, London, UK
tel:(061) 98765
fax:(061) 98765
email:blair@everywhere.com
--------------------------------------
name:Bill Clinton
address:White House, USA
tel:(001) 6400 98765
fax:(001) 6400 98765
email:bill@everywhere.com
--------------------------------------
name:Tom Cruise
address:57 Jumbo Street, New York, USA
tel:(001) 4500 67859
fax:(001) 4500 67859
email:cruise@everywhere.com
--------------------------------------
name:Linda Goodman
address:78 Crax Lane, London, UK
tel:(061) 54 56789
fax:(061) 54 56789
email:linda@everywhere.com
--------------------------------------
这个例子可以遍历得到xml中的节点名称和对应值(详见最后一个for循环)
另外要Node.getNodeType()为获取当前节点类型,此处在API中配置了不同的常量,代表不同的含义,详见API。
例子2:
package com.text.tool; import java.io.File; import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList; public class DomTest2 {
public static void main(String[] args) throws Exception {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); Document doc = db.parse(new File("student.xml")); // System.out.println(doc.getXmlEncoding());
// System.out.println(doc.getXmlVersion());
// System.out.println(doc.getXmlStandalone()); // 获得文档的根元素节点
Element root = doc.getDocumentElement(); System.out.println(root.getTagName()); NodeList list = root.getChildNodes(); System.out.println(list.getLength()); for (int i = 0; i < list.getLength(); i++) {
System.out.println(list.item(i).getNodeName());
} System.out.println("----------------------------------"); for (int i = 0; i < list.getLength(); i++) {
Node n = list.item(i); System.out.println(n.getNodeType() + " : " + n.getNodeValue());
} System.out.println("----------------------------------"); for (int i = 0; i < list.getLength(); i++) {
Node n = list.item(i); System.out.println(n.getTextContent());
} System.out.println("----------------------------------"); NodeList nodeList = doc.getElementsByTagName("学生"); for (int i = 0; i < nodeList.getLength(); i++) {
NamedNodeMap nnm = nodeList.item(i).getAttributes(); String attrName = nnm.item(0).getNodeName();
System.out.print(attrName); System.out.print("="); String attrValue = nnm.item(0).getNodeValue(); System.out.println(attrValue);
} }
}
XML:
<?xml version="1.0" encoding="utf-8"?>
<学生名册 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="student.xsd" >
<学生 学号="1">
<姓名>张三</姓名>
<性别>男</性别>
<年龄>20</年龄>
</学生>
<学生 学号="2">
<姓名>李四</姓名>
<性别>女</性别>
<年龄>19</年龄>
</学生>
<学生 学号="3">
<姓名>王五</姓名>
<性别>男</性别>
<年龄>21</年龄>
</学生>
</学生名册>
输出结果:
学生名册
7
#text
学生
#text
学生
#text
学生
#text
----------------------------------
3 : 1 : null
3 : 1 : null
3 : 1 : null
3 : ---------------------------------- 张三
男
20 李四
女
19 王五
男
21 ----------------------------------
学号=1
学号=2
学号=3
在例子2的基础上又做了修改
例子3
package com.text.tool; import java.io.File; import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Attr;
import org.w3c.dom.Comment;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList; /**
* 使用递归解析给定的任意一个xml文档并且将其内容输出到命令行上
*
* @author zhanglong
*
*/
public class DomTest3 {
public static void main(String[] args) throws Exception {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder(); Document doc = db.parse(new File("student.xml"));
// 获得根元素结点
Element root = doc.getDocumentElement(); parseElement(root);
} private static void parseElement(Element element) {
String tagName = element.getNodeName(); NodeList children = element.getChildNodes(); System.out.print("<" + tagName); // element元素的所有属性所构成的NamedNodeMap对象,需要对其进行判断
NamedNodeMap map = element.getAttributes(); // 如果该元素存在属性
if (null != map) {
for (int i = 0; i < map.getLength(); i++) {
// 获得该元素的每一个属性
Attr attr = (Attr) map.item(i); String attrName = attr.getName();
String attrValue = attr.getValue(); System.out.print(" " + attrName + "=\"" + attrValue + "\"");
}
} System.out.print(">"); for (int i = 0; i < children.getLength(); i++) {
Node node = children.item(i);
// 获得结点的类型
short nodeType = node.getNodeType(); if (nodeType == Node.ELEMENT_NODE) {
// 是元素,继续递归
parseElement((Element) node);
} else if (nodeType == Node.TEXT_NODE) {
// 递归出口
System.out.print(node.getNodeValue());
} else if (nodeType == Node.COMMENT_NODE) {
System.out.print("<!--"); Comment comment = (Comment) node; // 注释内容
String data = comment.getData(); System.out.print(data); System.out.print("-->");
}
} System.out.print("</" + tagName + ">");
}
}
XML同例子2一致。
输出结果:
<学生名册 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="student.xsd">
<学生 学号="1">
<姓名>张三</姓名>
<性别>男</性别>
<年龄>20</年龄>
</学生>
<学生 学号="2">
<姓名>李四</姓名>
<性别>女</性别>
<年龄>19</年龄>
</学生>
<学生 学号="3">
<姓名>王五</姓名>
<性别>男</性别>
<年龄>21</年龄>
</学生>
</学生名册>
以上3个例子来源《北京圣思园XML培训视频》。
xml--通过DOM解析XML的更多相关文章
- xml语法、DTD约束xml、Schema约束xml、DOM解析xml
今日大纲 1.什么是xml.xml的作用 2.xml的语法 3.DTD约束xml 4.Schema约束xml 5.DOM解析xml 1.什么是xml.xml的作用 1.1.xml介绍 在前面学习的ht ...
- Android之DOM解析XML
一.DOM解析方法介绍 DOM是基于树形结构的节点或信息片段的集合,允许开发人员使用DOM API遍历XML树,检索所需数据.分析该结构通常需要加载整个文档和构造树形结构,然后才可以检索和更新节点信息 ...
- JAVA中使用DOM解析XML文件
XML是一种方便快捷高效的数据保存传输的格式,在JSON广泛使用之前,XML是服务器和客户端之间数据传输的主要方式.因此,需要使用各种方式,解析服务器传送过来的信息,以供使用者查看. JAVA作为一种 ...
- 简单谈谈dom解析xml和html
前言 文件对象模型(Document Object Model,简称DOM),是W3C组织推荐的处理可扩展标志语言的标准编程接口.html,xml都是基于这个模型构造的.这也是一个W3C推出的标准.j ...
- Java从零开始学四十二(DOM解析XML)
一.DOM解析XML xml文件 favorite.xml <?xml version="1.0" encoding="UTF-8" standalone ...
- python 解析XML python模块xml.dom解析xml实例代码
分享下python中使用模块xml.dom解析xml文件的实例代码,学习下python解析xml文件的方法. 原文转自:http://www.jbxue.com/article/16587.html ...
- Java解析XML文档(简单实例)——dom解析xml
一.前言 用Java解析XML文档,最常用的有两种方法:使用基于事件的XML简单API(Simple API for XML)称为SAX和基于树和节点的文档对象模型(Document Object ...
- POPTEST老李分享DOM解析XML之java
POPTEST老李分享DOM解析XML之java Java提供了两种XML解析器:树型解释器DOM(Document Object Model,文档对象模型),和流机制解析器SAX(Simple ...
- Java XML DOM解析范例源码
下边内容内容是关于Java XML DOM解析范例的内容.import java.io.InputStream; import java.util.ArrayList; import java.uti ...
随机推荐
- Windows 2008 server R2安装.NET Framework4时提示“灾难性故障”解决
在安装行环境.NET Framework 4时无法安装,提示“灾难性故障”.服务器的操作系统是windows server 2008 R2. 查看系统日志时显示“无法安装 Windows 更新 &q ...
- (转)浅谈dedecms模板引擎工作原理及自定义标签
理解织梦模板引擎有什么意义?一方面可以更好地自定义标签.更多在于了解织梦系统,理解模板引擎是理解织梦工作原理的第一步.理解织梦会使我们写php代码时更顺手,同时能学习一些php代码的组织方式. 这似乎 ...
- iOS和hybird移动端性能
作为一名写了⑦年代码的程序员,目前我最擅长的领域是IOS的客户端开发,在移动领域的开发时间2年. ⑦年前,我刚入行的时候,曾经认为自己将会永远做一个LINUX 服务端C++程序员,于是花了大 ...
- How do I size a UITextView to its content?
UITextView 自适应高度,搬来一篇stack上的: Is there a good way to adjust the size of a UITextView to conform to ...
- Objective-C基础知识点总结
一.#import 和 #include 的区别,@class代表什么?@class 和 #import 的区别?#import<> 和 #import""的区别 答: ...
- js 去掉浏览器右击默认事件
1.整个页面所有的右击事件 document.oncontextmenu = function(){ return false; } 2.特定的区域 document.getElementById(& ...
- 【转】Hibernate和ibatis的比较
1. 简介 Hibernate是当前最流行的O/R mapping框架.它出身于sf.net,现在已经成为Jboss的一部分了.iBATIS是另外一种优秀的O/R mapping框架,现已改名叫myB ...
- VISUAL STUDIO 2005连接MYSQL数据库
// mysql.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <string.h> #include &l ...
- 委托异步调用时BeginInvoke的陷阱处理
这个陷阱来自于一个需求:需要异步在后台处理数据,处理完后触发处理完成的事件,大概是这么写的: EmployeeCollection data = new EmployeeCollection(): d ...
- Oracle中批量插入
为了防止OracleConnection的重复打开和关闭,使用begin end:将sql语句包在里面,然后一次性执行提高插入的效率. 下面代码中要插入的数据在list集合中,如果list集合的cou ...