XML DOM解析器

本文介绍了XML DOM解析器的工作原理,DOM是W3C制定的文档对象模型标准,用于解析XML和HTML文档。DOM解析器通过parse方法创建一个Document对象,表示整个文档结构。此外,文章详细阐述了Document节点的常用方法,如获取节点类型、子节点列表以及文本内容等,并讨论了文档节点之间的子孙关系。最后,给出了XML文件、对应的实体类和解析接口的示例。
摘要由CSDN通过智能技术生成

XML DOM解析器

DOM 解析器

DOM (Document Object Model,文档对象模型)是W3C制定的一套规范标准,规定了解析文档的接口,各种语言可以按照DOM规范去实现这些接口,给出文档的解析器。DOM规范中所指的文档相当广泛,包括XML文件和HTML文件。

接口只关心功能,不规定功能的具体实现,因此,在特定语言中使用DOM规范就需要定义DOM规范指定的接口,并给出实现这些接口的类的集合,这一过程称作语言绑定。

DOM文档节点

DOM解析器调用parse方法返回一个叫做Document对象,它是由实现了Node接口的实例组成的树状结构数据,这些实例称作Document对象中的节点。实际上Document接口也是Node接口的子接口。

DOM文档节点常用方法
  • short getNodeType()

    • 返回一个表示节点类型的常量(Node接口规定的常量值),例如对于Element节点getNodeType()方法返回的值为:Node.ELEMENT_NODE
  • NodeList getChildNodes()

    • 返回由当前节点的所有子节点组成的NodeList对象
  • Node getFirstChiild()

    • 返回当前节点的第一个子节点
  • Node getLastChild()

    • 返回当前节点的最后一个子节点
  • NodeList getTextContent()

    • 返回当前节点及所有子孙节点中的文本内容
文档节点子孙关系

为了解析规范的XML文档,DOM规定了各种类型节点之间可以形成子孙关系

这里写图片描述

示例

XML文件(books.xml)

<?xml version="1.0" encoding="UTF-8"?>
<books>
    <book bookno="001">
        <title>Java编程语言</title>
        <author>atuer</author>
        <price>80</price>
    </book>
    <book bookno="002">
        <title>算法</title>
        <author>高纳德</author>
        <price>100</price>
    </book>
</books>

XML对应实体类(Book.java)

package com.li.entity;

public class Book {
    private String bookNo;
    private String title;
    private String author;
    private Double price;
    public String getBookNo() {
        return bookNo;
    }
    public void setBookNo(String bookNo) {
        this.bookNo = bookNo;
    }
    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
    public String getAuthor() {
        return author;
    }
    public void setAuthor(String author) {
        this.author = author;
    }
    public Double getPrice() {
        return price;
    }
    public void setPrice(Double price) {
        this.price = price;
    }
    public Book() {
    }
    public Book(String bookNo, String title, String author, Double price) {
        super();
        this.bookNo = bookNo;
        this.title = title;
        this.author = author;
        this.price = price;
    }
    @Override
    public String toString() {
        return "Book [bookNo=" + bookNo + ", title=" + title + ", author=" + author + ", price=" + price + "]";
    }
}

解析接口(XmlParse.java)

package com.li.saxparse;

import java.util.List;

import com.li.entity.Book;

public interface XmlParse {
    public List<Book> parseXml(String fileName);
}

接口对应实现类(XMLDOMParser.java)

package com.li.domparse;

import java.io.File;
import java.io.IOException;
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.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

import com.li.entity.Book;
import com.li.saxparse.XmlParse;

public class DOMXMLParser implements XmlParse {

    @Override
    public List<Book> parseXml(String fileName) {
        List<Book> list=new ArrayList<>();

        /*获取文档生成器工厂对象*/
        DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();

        /*文档对象*/
        Document document=null;

        try {
            /*文档生成器*/
            DocumentBuilder builder=factory.newDocumentBuilder();

            document=builder.parse(new File(fileName));
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        /*根节点*/
        Node rootNode = (Node) document.getDocumentElement();
        /*获取<book>元素列表*/
        NodeList bookElementList = rootNode.getChildNodes();
        for(int i=0; i<bookElementList.getLength(); i++) {
            /*获取单个<book>元素*/
            Node bookelement = (Node) bookElementList.item(i);
            /*取节点名称*/
            if(bookelement.getNodeName().equals("book")) {
                Book book=new Book();

                /*节点属性*/
                NamedNodeMap map=bookelement.getAttributes();
                Node booknoNode = (Node) map.getNamedItem("bookno");
                String bookNoString=booknoNode.getNodeValue();
                book.setBookNo(bookNoString.trim());

                /*获取子节点*/
                NodeList subBookElementList = bookelement.getChildNodes();
                for(int j=0; j<subBookElementList.getLength(); j++) {

                    /*子节点*/
                    Node subElemtNode = (Node) subBookElementList.item(j);

                    /*子节点元素名称*/
                    String subElementNameString=subElemtNode.getNodeName();

                    /*分析子节点元素名称从而获取内容*/
                    if(subElementNameString.equals("title")) {
                        /*获取节点内容*/
                        book.setTitle(subElemtNode.getTextContent().trim());
                    }
                    if(subElementNameString.equals("author")) {
                        /*获取节点内容*/
                        book.setAuthor(subElemtNode.getTextContent().trim());
                    }
                    if(subElementNameString.equals("price")) {
                        /*获取节点内容*/
                        book.setPrice(Double.parseDouble(subElemtNode.getTextContent().trim()));
                    }
                }
                list.add(book);
            }
        }
        return list;
    }

    public static void main(String[] args) {
        XmlParse parser = new DOMXMLParser();
        List<Book> list = parser.parseXml("books.xml");
        System.out.println("DOM解析结果: ");
        for(Book book : list) {
            System.out.println(book);
        }
    }
}

运行结果

DOM解析结果: 
Book [bookNo=001, title=Java编程语言, author=atuer, price=80.0]
Book [bookNo=002, title=算法, author=高纳德, price=100.0]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值