XML的DOM解析方式

XML解析流程

  1. 核心包

    javax.xml.parsers 包中的DocumentBuilderFactory用于创建DOM模式的解析器对象 ,
    DocumentBuilderFactory是一个抽象工厂类,它不能直接实例化,但该类提供了一个newInstance方法 ,这个方法会根据本地平台默认安装的解析器,自动创建一个工厂的对象并返回。

  2. 解析流程

    • 调用 DocumentBuilderFactory.newInstance() 方法得到创建 DOM 解析器的工厂。

      DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
      
    • 调用工厂对象的 newDocumentBuilder方法得到 DOM 解析器对象。

      DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();
      
    • 把要解析的 XML 文档转化为输入流,以便 DOM 解析器解析它

    InputStream is= new  FileInputStream(".xml");   
    
    1. 调用 DOM 解析器对象的 parse() 方法解析 XML 文档,得到代表整个文档的 Document 对象,进行可以利用DOM特性对整个XML文档进行操作了。
    Document doc=dombuilder.parse(is);
    
    1. 得到 XML 文档的根节点
    Element root=doc.getDocumentElement();
    
    1. 得到节点的子节点
    NodeList users=root.getChildNodes();
    
    1. 节点的操作

代码实现

  • 项目结构
    XML的DOM解析方式_第1张图片

  • XML文件

    
    <books>
        <book id="1">
            <name>书本1name>
            <price>2.28price>
        book>
        <book id="2">
            <name>书籍2name>
            <price>6.66price>
        book>
    books>
    
  • 实体类

    package com.tmq;
    
    public class Book {
        private int id;
        private String name;
        private float price;
    
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public float getPrice() {
            return price;
        }
        public void setPrice(float price) {
            this.price = price;
        }
    
        @Override
        public String toString() {
            return "Book{" +
                    "id=" + id +
                    ", name='" + name + '\'' +
                    ", price=" + price +
                    '}';
        }
    }
    
    

  • 工具类

    package com.tmq;
    
    import org.w3c.dom.Document;
    import org.w3c.dom.Element;
    import org.w3c.dom.NodeList;
    
    import javax.xml.parsers.DocumentBuilder;
    import javax.xml.parsers.DocumentBuilderFactory;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.InputStream;
    import java.util.ArrayList;
    import java.util.List;
    
    public class ParseXML {
    
        DocumentBuilderFactory domfac = DocumentBuilderFactory.newInstance();
    
        {
            try {
                DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
                DocumentBuilder builder = factory.newDocumentBuilder();
                InputStream is = new FileInputStream(new File("Book.xml"));
                Document document = builder.parse(is);
                Element element = document.getDocumentElement();
                //获取书本所有节点
                NodeList bookNodelist = element.getElementsByTagName("book");
    
                List<Book> list = new ArrayList<>();
                for(int i = 0;i < bookNodelist.getLength();i++){
                    Book book = new Book();
                    Element bookElement = (Element)bookNodelist.item(i);
                    //读取书本id信息
                    book.setId(Integer.parseInt(bookElement.getAttribute("id")));
                    //获取书本所有的子信息
                    NodeList bookChildNodelist = bookElement.getChildNodes();
                    //遍历写入
                    for(int j = 0;j < bookChildNodelist.getLength();j++) {
                        if ("name".equals(bookChildNodelist.item(j).getNodeName())) {
                            book.setName(bookChildNodelist.item(j).getFirstChild().getNodeValue());
                        } else if ("price".equals(bookChildNodelist.item(j).getNodeName())) {
                            book.setPrice(Float.parseFloat(bookChildNodelist.item(j).getFirstChild().getNodeValue()));
                        }
                    }
                   list.add(book);
                }
                System.out.println("该Xml中有:"+bookNodelist.getLength()+"书信息");
                System.out.println(list);
                for(Book b:list){
                b.toString();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    
    

  • 测试方法

    package com.tmq;
    
    public class main {
        public static void main(String[] args) {
            ParseXML parseXML = new ParseXML();
        }
    }
    

    点击获取代码资源@TMQ

你可能感兴趣的:(前端基础)