Java XML解析

Java XML解析

DOM解析

DOM(Document Object Model,文档对象模型)。
优点:将XML文档转换成一个对象模型集合,可以在任何时候访问XML文档中的任何一部分数据
缺点:当文档比较大或者结构比较复杂时,对内存的需求就比较高。

DOM解析有4个核心的操作接口:

  • Document:此接口代表整个XML文档,表示整颗DOM树的根。
    Java XML解析_第1张图片
  • Node:每一个Node接口代表了DOM树种的一个节点
    Java XML解析_第2张图片
  • NodeList:此接口表示一个节点的集合
    NodeList
  • NamedNodeMap:表示一组节点和其唯一名称对应的一一对应关系。主要用于属性节点的表示。

DOM解析步骤

  1. 建立DocumentBuilderFactoryDocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
  2. 建立DocumentBuilderDocumentBuilder db = dbf.newDocumentBuilder();
  3. 建立DocumentDocument document = db.parse("要读取的文件路径");
  4. 建立NodeListNodeList nl = document.getElementsByTagName("读取节点");
  5. 进行XML信息读取
        //创建一个DocumentdBuilderFactory的对象
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

        try {
            //创建一个DocumentBuilder对象
            DocumentBuilder db = dbf.newDocumentBuilder();
            //通过DocumentBuilder的parse方法解析books.xml文件
            Document document = db.parse("books.xml");
            //获取book节点的集合
            NodeList bookList = document.getElementsByTagName("book");
            //遍历每一个book节点
            for(int i=0; i <bookList.getLength(); i++)
            {
                /* //通过item(i)方法获取一个book节点,nodelist的索引值从0开始 Node book = bookList.item(i); //获取book节点的所有属性值 NamedNodeMap attrs = book.getAttributes(); //遍历 for(int j=0; j < attrs.getLength(); j++) { //获取属性 Node attr = attrs.item(j); System.out.println("属性名:"+attr.getNodeName()+"属性值:"+attr.getNodeValue()); } */

                /* * 前提:已经知道book节点有且只能有1个id属性 * 将book节点进行强制类型转换,转换成Element类型 */
                Element book = (Element)bookList.item(i);
                String attrValue = book.getAttribute("id");
                System.out.println("id->"+attrValue);

                System.out.println("=======");
            }
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (SAXException | IOException e) {
            e.printStackTrace();
        }

DOM XML文件输出
如果要将XML文件,保存在硬盘山,需要使用到的类:

  • TransformerFactory 获取一个Transformer类的实例对象
  • Transformer
  • DOMSource 接收Document对象
  • StreamResult 指定要使用的输出流对象(可以向文件输出,也可以向指定的输出流输出)
        //建立DocumentBuilderFactory,用于获取DocumentBuilder
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        //通过DocumentBuilderFactory取得DocumentBuilder
        DocumentBuilder builder = null;
        try {
            builder = factory.newDocumentBuilder();
        } catch (Exception e) {
            e.printStackTrace();
        }
        //定义Document接口对象,通过DocumentBuilder类进行DOM树的转换操作
        Document doc = null;
        doc = builder.newDocument();
        //建立各个操作节点
        Element addresslist = doc.createElement("addresslist");
        Element linkman = doc.createElement("linkman");
        Element name = doc.createElement("name");
        Element email = doc.createElement("email");
        //设置节点的文本内容
        name.appendChild(doc.createTextNode("张三"));
        email.appendChild(doc.createTextNode("[email protected]"));
        //设置节点关系
        linkman.appendChild(name);
        linkman.appendChild(email);
        addresslist.appendChild(linkman);
        doc.appendChild(addresslist);
        //输出文档到文件中
        TransformerFactory tf = TransformerFactory.newInstance();
        Transformer t = null;
        try {
            t = tf.newTransformer();
        } catch (Exception e) {
            e.printStackTrace();
        }
        t.setOutputProperty(OutputKeys.ENCODING, "UTF-8");//设置编码
        DOMSource source = new DOMSource(doc);//输出文档
        StreamResult result = new StreamResult(new File("output.xml"));
        try {
            t.transform(source, result);//输出
        } catch (Exception e) {
            e.printStackTrace();
        }

最终创建的xml文件内容如下:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<addresslist>
    <linkman>
        <name>张三</name>
        <email>[email protected]</email>
    </linkman>
</addresslist>

SAX解析

SAX(Simple APIs for XML,操作XML的简单接口),与DOM操作不同,SAX采用的是一种顺序的模式进行访问,是一种快速读取XML数据的方式。使用SAX解析器进行操作时会触发一系列事件。
Java XML解析_第3张图片

如何使用SAX解析?
1. 编写一个SAX解析器,该类继承自DefaultHandler

package com.imooc.test;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

//定义SAX解析器
public class MySAX extends DefaultHandler {

    //文档开始
    @Override
    public void startDocument() throws SAXException {
        System.out.println("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>");
    }

    //文档结束
    @Override
    public void endDocument() throws SAXException {
        System.out.println("\n 文档读取结束...");
    }

    //元素开始
    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        System.out.println("<");
        System.out.println(qName);//输出元素名称
        if(attributes != null){//取得全部的属性
            for (int i = 0; i < attributes.getLength(); i++) {
                System.out.println(" "+attributes.getQName(i)+"=\""
                                    +attributes.getValue(i)+"\" ");
            }
        }
        System.out.println(">");
    }

    //取出元素内容
    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        System.out.println(new String(ch,start, length));
    }

    //元素结束
    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        System.out.println("</");
        System.out.println(qName);
        System.out.println(">");
    }

}
  1. 还需要SAXParserFactorySAXParser
        //建立SAX解析工厂
        SAXParserFactory factory = SAXParserFactory.newInstance();
        //构建解析器
        SAXParser parser = factory.newSAXParser();
        //解析XML使用HANDLER
        parser.parse("books.xml", new MySAX());

DOM解析与SAX解析的区别

Java XML解析_第4张图片

JDOM

JDOM=DOM修改文件的优点+SAX读取快速的优点

DOM4J

你可能感兴趣的:(java,xml)