DOM解析

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏一个会写诗的程序员的博客

《Kotlin极简教程》第五章 Kotlin面向对象编程(OOP)一个OOP版本的HelloWorld构造函数传参Data Class定义接口&实现之写pojo bean定一个Rectangle对象封

We frequently create a class to do nothing but hold data. In such a class some s...

2324
来自专栏跟着阿笨一起玩NET

VB.NET自我总结语法

1161
来自专栏Java帮帮-微信公众号-技术文章全总结

Java基础-day10-代码题-继承&抽象类

Java基础-day10-代码题-继承&抽象类 1.门类继承题: 编写代码,实现如下功能: (1)定义一个门类, 包含3个属性:宽度width 和 高度hei...

4866
来自专栏一个会写诗的程序员的博客

jQuery Validate自定义各种验证方法jQuery Validate自定义各种验证方法

1002
来自专栏小樱的经验随笔

Codeforces Beta Round #1 A,B,C

A. Theatre Square time limit per test:1 second memory limit per test:256 megabyt...

3105
来自专栏Golang语言社区

Go语言struct类型详解

struct Go语言中,也和C或者其他语言一样,我们可以声明新的类型,作为其它类型的属性或字段的容器。例如,我们可以创建一个自定义类型person代表一个人的...

3027
来自专栏Python

JavaScript基础

一 JavaScript的基础 1.1 JS的引入方式 1 直接编写 <script> alert('hello yuan') ...

2648
来自专栏Golang语言社区

深入剖析Go语言编程中switch语句的使用

switch语句可以让一个变量对反对值的列表平等进行测试。每个值被称为一个的情况(case),变量被接通检查每个开关盒(switch case)。 在Go编程,...

3647
来自专栏Golang语言社区

实效go编程--2

Go函数的返回值或结果“形参”可被命名,并作为常规变量使用,就像传入的形参一样。 命名后,一旦该函数开始执行,它们就会被初始化为与其类型相应的零值; 若该函数执...

3477
来自专栏Golang语言社区

Go语言struct类型详解

struct Go语言中,也和C或者其他语言一样,我们可以声明新的类型,作为其它类型的属性或字段的容器。例如,我们可以创建一个自定义类型person代表一个人的...

2864

扫码关注云+社区

领取腾讯云代金券