【XML】DOM解析XML

本文介绍DOM作为XML文档的标准表示方式,及其在Java中的具体应用。DOM允许开发者在文档树中定位并修改信息,文章详细解释了DOM的四个核心接口:Document、Node、NodeList和NamedNodeMap,并通过示例代码展示了如何使用DOM进行XML解析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


DOM解析XML

org.w3c.dom

1. DOM(Document Object Model)

      DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准。DOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。由于它是基于信息层次的,因而DOM被认为是基于树或基于对象的。

【优点】
      ①允许应用程序对数据和结构做出更改。
      ②访问是双向的,可以在任何时候在树中上下导航,获取和操作任意部分的数据。
【缺点】
      ①通常需要加载整个XML文档来构造层次结构,消耗资源大
    


2. DOM的四个基本接口


  在DOM接口规范中,有四个基本的接口:Document, Node, NodeList, NamedNodeMap。

Document

  Document接口是对文档进行操作的入口,它是从Node接口继承过来的。 

Node

  Node接口是其他大多数接口的父类。

  在DOM树中,Node接口代表了树中的一个节点。

NodeList

  NodeList接口是一个节点的集合,它包含了某个节点中的所有子节点。

  它提供了对节点集合的抽象定义,并不包含如何实现这个节点集的定义。

  NodeList用于表示有顺序关系的一组节点,比如某个节点的子节点序列。

  在DOM中,NodeList的对象是live的,对文档的改变,会直接反映到相关的NodeList对象中。

 

NamedNodeMap

  NamedNodeMap接口也是一个节点的集合,通过该接口,可以建立节点名和节点之间的一一映射关系,从而利用节点名可以直接访问特定的节点,这个接口主要用在属性节点的表示上。

  尽管NamedNodeMap所包含的节点可以通过索引来进行访问,但是这只是提供了一种枚举方法,NamedNodeMap所包含的节点集中节点是无序的。

  与NodeList相同,在DOM中,NamedNodeMap对象也是live的




/**
 * 使用DOM解析xml
 * 
 * @author xiazhang
 * @date   2017-6-5
 */
public class DomParseXmlTest {

	
	public static void parsexml(String fileName){
		try {
			//step1:实例化一个DOM构建器工厂
			DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
			//step2:通过DOM构建器工厂获取一个DOM构建器 
			DocumentBuilder db = dbf.newDocumentBuilder();
			//step3:builder.parse()方法将给定文件的内容解析为一个XML文档, 并且返回一个新的 DOM Document对象
			//Document文档操作入口
			Document document = db.parse(fileName);
			
			//直接根据标签名访问任意节点
			NodeList list = document.getElementsByTagName("name");
			System.out.println(list.getLength());
			for (int s = 0; s < list.getLength(); s++) {
				//打印为Null,使用list.item(s).getFirstChild().getNodeValue()
				System.out.println(list.item(s).getNodeValue());
				System.out.println(list.item(s).getFirstChild().getNodeValue());
				//System.out.println(list.item(s).getTextContent());
			}
			
			
			//step4:获取document的所有子节点(不包括属性节点),返回一个NodeList对象。注意,在DOM解析时会将所有回车都视为节点
			NodeList users = document.getChildNodes();
			
			//获取文档的根元素
			Element rootElement = document.getDocumentElement();
			//获取根元素的属性
			System.out.println(rootElement.getAttribute("xmlns"));
			System.out.println(rootElement.getAttribute("nihao"));
			
			//users.getLength() 节点长度
			for (int i = 0; i < users.getLength(); i++) {
				//获取childNodes的第i个节点 
				Node user = users.item(i);
				//则获取childNode的所有子节点(不包括属性节点),返回一个NodeList对象
				NodeList userInfo = user.getChildNodes();
				for (int j = 0; j < userInfo.getLength(); j++) {
					Node node = userInfo.item(j);
					NodeList userMeta = node.getChildNodes();
					for (int k = 0; k < userMeta.getLength(); k++) {
						if(userMeta.item(k).getNodeName() != "#text"){
							System.out.println(userMeta.item(k).getNodeName()
								+":"+ userMeta.item(k).getTextContent());
						}
					}
					System.out.println();
				}
				
			}
		} catch (FileNotFoundException e) {
            e.printStackTrace();
		} catch (ParserConfigurationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SAXException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		
	}
	
	
	
	
	public static void main(String[] args) {
		parsexml("testXml.xml");
	}
	
	
}

解析所使用的XML

<?xml version="1.0" encoding="UTF-8"?>
<users nihao="hello" xmlns="http://test.org/books">
    <user id="0">
        <name>xiazhang</name>
        <age>23</age>
        <sex>男</sex>
    </user>
    <user id="1">
        <name>jinnan</name>
        <age>25</age>
        <sex>女</sex>
    </user>
</users>









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值