[size=xx-large][color=red]用 DOM 读取 XML 文档时,不需要任何的第三方jar包,并且DOM是HTML与XML的应用编程接口(API),也就是说用 DOM 只能读取 HTML和 XML 两种格式的文件,DOM是官方制定的规范。[/color][/size]
下面是在控制台出现的结果:
<!-- XML 文档 -->
<?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>
package com.syh.xml.dom;
import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
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() ;
//step 2 : 获得具体的 DOM 解析器
DocumentBuilder db = dbf.newDocumentBuilder() ;
//step 3 : 解析一个 xml 文档,获得 Docuement 对象(根节点)---这个相当于拿到了进入XML文档的入口
Document document = db.parse(new File("candidate.xml")) ;
//step 4 : 根据标签名字获得节点列表 , 这里获得了根元素节点
//getElementsByTagName() 这个方法是不能跨层取值的,
//比如说: <NAME> 是 <PERSON>( PERSON 是根元素节点) 的一个子元素,在用这个方法的时候,我们要取得 <NAME> 的文本信息,
//不能在事先没有实现调用 getElementsByTagName("PERSON") 的情况下, 调用 getElementsByTagName("NAME")
//这是为什么呢? 因为 DOM 是用树的模型访问 XML 文档的,如果直接调用 getElementsByTagName("NAME"),就会认为 <NAME> 是根元素节点!
NodeList list = document.getElementsByTagName("PERSON") ;
//System.out.println(list.getLength());
for (int i = 0 ; i < list.getLength() ; i ++) {
//这是拿到了一个具体的 Element 对象了,针对于这个文档,这时定位到了<PERSON>
Element ele = (Element) list.item(i) ;
//这时定位到了<PERSON>元素中的<NAME>子元素<——ele.getElementsByTagName("NAME").item(0) 通过这个方法
//这时定位到了<name>元素的第一个“孩子”,也就是<name>元素中的第一个子元素 <——ele.getElementsByTagName("NAME").item(0).getFirstChild()
//为什么要在调用 ele.getElementsByTagName("NAME").item(0) 方法后还要调用 getFirstChild() 方法呢?
//直接调用 getNodeValue()这个方法返回一个文本信息(这个方法返回 String )不就可以了吗? 而且 <NAME> 元素中也没有子元素啊!这是为什么呢?
//<NAME>Tony Blair</NAME> 在W3C制定规范中也把 <NAME>元素中的文本信息也当成一个子元素了!可是文本信息没有什么TagName(标签名)啊!也就是说文本信息怎么会有子元素呢?
//所以就调用了 getFirstChild() 这个方法, 将 Tony Blair 当成了这个文本信息的第一个“孩子”,也就是第一个元素
String content = ele.getElementsByTagName("NAME").item(0).getFirstChild().getNodeValue() ;
System.out.println("name : " + content);
//获取<ADDRESS>的文本信息
content = ele.getElementsByTagName("ADDRESS").item(0).getFirstChild().getNodeValue() ;
System.out.println("address : " + content);
//获取<TEL>的文本信息
content = ele.getElementsByTagName("TEL").item(0).getFirstChild().getNodeValue() ;
System.out.println("tel : " + content);
//获取<FAX>的文本信息
content = ele.getElementsByTagName("FAX").item(0).getFirstChild().getNodeValue() ;
System.out.println("fax : " + content);
//获取<EMAIL>的文本信息
content = ele.getElementsByTagName("EMAIL").item(0).getFirstChild().getNodeValue() ;
System.out.println("email : " + content);
System.out.println("---------------------------------------");
}
}
}
下面是在控制台出现的结果:
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
---------------------------------------