DOM解析

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介:
Dom解析是将xml文件全部载入,组装成一颗dom树,然后通过节点以及节点之间的关系来解析xml文件
根据 DOM,XML 文档中的每个成分都是一个节点。
DOM 是这样规定的:

整个文档是一个文档节点
每个 XML 标签是一个元素节点
包含在 XML 元素中的文本是文本节点
每一个 XML 属性是一个属性节点
注释属于注释节点

位于org.w3c.dom操作XML会比较简单,就是将XML看做是一颗树,DOM就是对这颗树的一个数据结构的描述,但对大型XML文件效果可能会不理想

首先来了解点Java DOM 的 API:
1.解析器工厂类:DocumentBuilderFactory

创建的方法:DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

2.解析器:DocumentBuilder

创建方法:通过解析器工厂类来获得 DocumentBuilder db = dbf.newDocumentBuilder();

3.文档树模型Document

创建方法:a.通过xml文档 Document doc = db.parse("bean.xml");  b.将需要解析的xml文档转化为输入流InputStream is = new FileInputStream("bean.xml");

 Document doc = db.parse(is); 

Document对象代表了一个XML文档的模型树,所有的其他Node都以一定的顺序包含在Document对象之内,排列成一个树状结构,以后对XML文档的所有操作都与解析器无关,

直接在这个Document对象上进行操作即可;

 包含的方法:

4.节点列表类NodeList

NodeList代表了一个包含一个或者多个Node的列表,根据操作可以将其简化的看做为数组

5.节点类Node

Node对象是DOM中最基本的对象,代表了文档树中的抽象节点。但在实际使用中很少会直接使用Node对象,而是使用Node对象的子对象Element,Attr,Text等

6.元素类Element

是Node类最主要的子对象,在元素中可以包含属性,因而Element中有存取其属性的方法

7.属性类Attr

代表某个元素的属性,虽然Attr继承自Node接口,但因为Attr是包含在Element中的,但并不能将其看做是Element的子对象,因为Attr并不是DOM树的一部分


DOM 实例
请看下面的 XML 文件 (books.xml):

<?xml version="1.0" encoding="ISO-8859-1"?>

<bookstore>

<book category="children">
  <title lang="en">Harry Potter</title>
  <author>J K. Rowling</author>
  <year>2005</year>
  <price>29.99</price>
</book>

<book category="cooking">
  <title lang="en">Everyday Italian</title>
  <author>Giada De Laurentiis</author>
  <year>2005</year>
  <price>30.00</price>
</book>

<book category="web">
  <title lang="en">Learning XML</title>
  <author>Erik T. Ray</author>
  <year>2003</year>
  <price>39.95</price>
</book>

<book category="web">
  <title lang="en">XQuery Kick Start</title>
  <author>James McGovern</author>
  <author>Per Bothner</author>
  <author>Kurt Cagle</author>
  <author>James Linn</author>
  <author>Vaidyanathan Nagarajan</author>
  <year>2003</year>
  <price>49.99</price>
</book>

</bookstore>


package com.tg.parse;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

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.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

import com.tg.beans.Book;

public class DomParseService {
	
	public List<Book> getBooks() throws ParserConfigurationException, SAXException, IOException{
			List<Book> list = new ArrayList<Book>(); 
		    //得到DOM解析器的工厂实例
	        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();  
	        //从DOM工厂中获得DOM解析器
	        DocumentBuilder builder = factory.newDocumentBuilder();  
	        //把要解析的xml文档读入DOM解析器
	        Document document = builder.parse("book.xml"); 
	     
	        //得到文档的元素
	        Element element = document.getDocumentElement();  
	        //得到文档名称为book的元素的节点列表
	        NodeList bookNodes = element.getElementsByTagName("book");  
	        for(int i=0;i<bookNodes.getLength();i++){  
	            Element bookElement = (Element) bookNodes.item(i);  
	            Book book = new Book();  
	            book.setCategory(bookElement.getAttribute("category"));  
	            NodeList childNodes = bookElement.getChildNodes();  
//	          System.out.println("*****"+childNodes.getLength());  
	            for(int j=0;j<childNodes.getLength();j++){  
	                if(childNodes.item(j).getNodeType()==Node.ELEMENT_NODE){  
	                    if("title".equals(childNodes.item(j).getNodeName())){  
	                        book.setTitle(childNodes.item(j).getFirstChild().getNodeValue());
	                        System.out.println(childNodes.item(j).getFirstChild().getNodeValue());
	                    }else if("price".equals(childNodes.item(j).getNodeName())){  
	                        book.setPrice(Float.parseFloat(childNodes.item(j).getFirstChild().getNodeValue()));  
	                        System.out.println(childNodes.item(j).getFirstChild().getNodeValue());
	                    } else if("author".equals(childNodes.item(j).getNodeName())){  
	                        book.setAuthor(childNodes.item(j).getFirstChild().getNodeValue());
	                        System.out.println(childNodes.item(j).getFirstChild().getNodeValue());
	                    } else if("year".equals(childNodes.item(j).getNodeName())){  
	                        book.setYear(childNodes.item(j).getFirstChild().getNodeValue());  
	                        System.out.println(childNodes.item(j).getFirstChild().getNodeValue());
	                    }  
	                }  
	            }//end for j  
	            list.add(book);  
	        }//end for i  
	        return list;  

	}
	
	

	
	 /**
     * 向已存在的xml文件中插入元素
     * */
    public  void insertXml(){
        Element bookstore = null;
        Element book = null;
        Element title = null;
        Element year = null;
        Element author = null;
        Element price = null;
      
        try{
            //得到DOM解析器的工厂实例
            DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
            //从DOM工厂中获得DOM解析器
            DocumentBuilder dbBuilder = dbFactory.newDocumentBuilder();
            //把要解析的xml文档读入DOM解析器
            Document doc = dbBuilder.parse("book.xml");
            System.out.println("asa"+doc);
            //得到文档名称为book的元素的节点列表
            NodeList nList = doc.getElementsByTagName("bookstore");
            bookstore = (Element)nList.item(0);
          
            //创建名称为book的元素
            book = doc.createElement("book");
            //设置元素book的属性值为231
            book.setAttribute("category", "men");
            //创建名称为Name的元素
            title = doc.createElement("title");
            //创建名称为 香香 的文本节点并作为子节点添加到name元素中
            title.appendChild(doc.createTextNode("C语言"));
            //将name子元素添加到book中
            book.appendChild(title);
            /**
             * 下面的元素依次加入即可
             * */
            year = doc.createElement("year");
            year.appendChild(doc.createTextNode("2020"));
            book.appendChild(year);
            
            author = doc.createElement("author");
            author.appendChild(doc.createTextNode("汤高"));
            book.appendChild(author);
            
            price = doc.createElement("price");
            price.appendChild(doc.createTextNode("22.22"));
            book.appendChild(price);
           
            
            //将book作为子元素添加到树的根节点bookstore
            bookstore.appendChild(book);
            //将内存中的文档通过文件流生成insertbookstore.xml,XmlDocument位于crison.jar下
            
        
        }catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }    
    }
	
    public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
    	DomParseService dom=new DomParseService();
    	   dom.getBooks();
	      

	     dom.insertXml();
	     dom.getBooks();
	     
	}
}






结果

Harry Potter
J K. Rowling
2005
29.99
Everyday Italian
Giada De Laurentiis
2005
30.00
Learning XML
Erik T. Ray
2003
39.95
XQuery Kick Start
James McGovern
Per Bothner
Kurt Cagle
James Linn
Vaidyanathan Nagarajan
2003
49.99


目录
相关文章
|
3月前
|
JavaScript 前端开发 Go
CSS 与 JS 对 DOM 解析和渲染的影响
【10月更文挑战第16天】CSS 和 JS 会在一定程度上影响 DOM 解析和渲染,了解它们之间的相互作用以及采取适当的优化措施是非常重要的。通过合理的布局和加载策略,可以提高网页的性能和用户体验,确保页面能够快速、流畅地呈现给用户。在实际开发中,要根据具体情况进行权衡和调整,以达到最佳的效果。
|
3月前
|
XML Web App开发 JavaScript
XML DOM 解析器
XML DOM 解析器
|
3月前
|
XML Web App开发 JavaScript
XML DOM 解析器
XML DOM 解析器
|
3月前
|
JavaScript 前端开发 算法
React 虚拟 DOM 深度解析
【10月更文挑战第5天】本文深入解析了 React 虚拟 DOM 的工作原理,包括其基础概念、优点与缺点,以及 Diff 算法的关键点。同时,分享了常见问题及解决方法,并介绍了作者在代码/项目上的成就和经验,如大型电商平台的前端重构和开源贡献。
71 3
|
3月前
|
XML Web App开发 JavaScript
XML DOM 解析器
XML DOM 解析器
|
3月前
|
XML Web App开发 JavaScript
XML DOM 解析器
XML DOM 解析器
|
3月前
|
XML Web App开发 JavaScript
XML DOM 解析器
XML DOM 解析器
|
2月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
87 2
|
12天前
|
存储 设计模式 算法
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
行为型模式用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,它涉及算法与对象间职责的分配。行为型模式分为类行为模式和对象行为模式,前者采用继承机制来在类间分派行为,后者采用组合或聚合在对象间分配行为。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象行为模式比类行为模式具有更大的灵活性。 行为型模式分为: • 模板方法模式 • 策略模式 • 命令模式 • 职责链模式 • 状态模式 • 观察者模式 • 中介者模式 • 迭代器模式 • 访问者模式 • 备忘录模式 • 解释器模式
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
|
12天前
|
设计模式 存储 安全
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象结构型模式比类结构型模式具有更大的灵活性。 结构型模式分为以下 7 种: • 代理模式 • 适配器模式 • 装饰者模式 • 桥接模式 • 外观模式 • 组合模式 • 享元模式
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析