xml文件解析——历程

package com.mipo.xml.parser;

public class App {

    private static java.io.InputStream resource = Thread.currentThread().getContextClassLoader()
            .getResourceAsStream("book.xml");

    public static void main(String[] args) {
        // writeWithDOM4J();
        // readWithDOM4J();
        // writeWithJDOM();
        // readWithJDOM();
        // writeWithSAX();
        // readWithSAX();
        // writeWithDOM();
        // readWithDOM();
    }

    /**
     * DOM4J生成XML
     */
    static void writeWithDOM4J() {
        // 建立document对象,用来操作XML文件
        org.dom4j.Document document = org.dom4j.DocumentHelper.createDocument();
        // 创建根节点
        org.dom4j.Element rootElement = document.addElement("persons");
        // 添加person节点
        org.dom4j.Element personElement = rootElement.addElement("person");
        // 为person节点添加name子节点
        org.dom4j.Element nameElement = personElement.addElement("name");
        // 为name节点添加文本内容
        nameElement.addText("郝连春水");
        // 为name节点添加no属性
        nameElement.addAttribute("no", "9527");
        // 为person节点添加sex子节点
        org.dom4j.Element sexElement = personElement.addElement("sex");
        // 为sex节点添加文本内容
        sexElement.addText("男");

        // 添加person节点
        personElement = rootElement.addElement("person");
        // 为person节点添加name子节点
        nameElement = personElement.addElement("name");
        // 为name节点添加文本内容
        nameElement.addText("纳兰容若");
        // 为name节点添加no属性
        nameElement.addAttribute("no", "1001");
        // 为person节点添加sex子节点
        sexElement = personElement.addElement("sex");
        // 为sex节点添加文本内容
        sexElement.addText("男");

        try {
            // 创建输出格式
            org.dom4j.io.OutputFormat format = org.dom4j.io.OutputFormat.createPrettyPrint();
            // 制定输出XML的编码类型
            format.setEncoding("UTF-8");
            // 创建文件输出流
            org.dom4j.io.XMLWriter xmlWriter = new org.dom4j.io.XMLWriter(
                    new java.io.FileWriter(new java.io.File("./src/main/resources/persons.xml")), format);
            xmlWriter.write(document);
            xmlWriter.flush();
            xmlWriter.close();
        } catch (java.io.IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * DOM4J解析XML
     */
    static void readWithDOM4J() {
        // 创建解析器
        org.dom4j.io.SAXReader saxReader = new org.dom4j.io.SAXReader();
        try {
            // 读取XML文件,获得document对象
            org.dom4j.Document document = saxReader.read(resource);
            // 获取根节点
            org.dom4j.Element rootElement = document.getRootElement();
            System.out.println("根节点: " + rootElement.getName());

            // 获取根节点下的所有子节点
            @SuppressWarnings("unchecked")
            java.util.List<org.dom4j.Element> nodes = rootElement.elements();
            for (org.dom4j.Element bookElement : nodes) {
                // 获取当前节点的所有属性
                @SuppressWarnings("unchecked")
                java.util.List<org.dom4j.Attribute> attributes = bookElement.attributes();
                for (org.dom4j.Attribute attr : attributes) {
                    System.out.println(attr.getName() + " ::  " + attr.getValue());
                }

                // 获取当前节点下的所有子节点
                @SuppressWarnings("unchecked")
                java.util.List<org.dom4j.Element> records = bookElement.elements();
                for (org.dom4j.Element item : records) {
                    System.out.println(item.getName() + " ::: " + item.getText());
                }
            }
        } catch (org.dom4j.DocumentException e) {
            e.printStackTrace();
        }
    }

    /**
     * JDOM生成XML
     */
    static void writeWithJDOM() {
        // 创建根节点
        org.jdom2.Element rootElement = new org.jdom2.Element("phones");
        // 创建document对象
        org.jdom2.Document document = new org.jdom2.Document(rootElement);
        // 创建phone节点
        org.jdom2.Element phone = new org.jdom2.Element("phone");
        // 为phone节点子节点 <name>iPhone 6S</name>
        phone.addContent(new org.jdom2.Element("name").setText("iPhone 6S"));
        // 为phone节点子节点 <price type="CNY" color="RED">5800</price>
        phone.addContent(new org.jdom2.Element("price").setText("5800").setAttribute("type", "CNY")
                .setAttribute("color", "RED"));
        // 讲person节点加入根节点
        rootElement.addContent(phone);
        // 创建phone节点
        phone = new org.jdom2.Element("phone");
        // 为phone节点子节点 <name>SUMSANG NOTE 7</name>
        phone.addContent(new org.jdom2.Element("name").setText("SUMSANG NOTE 7"));
        // 为phone节点子节点 <price type="CNY">7800</price>
        phone.addContent(new org.jdom2.Element("price").setText("7800").setAttribute("type", "CNY"));
        // 讲person节点加入根节点
        rootElement.addContent(phone);

        // 控制XML格式化
        org.jdom2.output.Format pf = org.jdom2.output.Format.getPrettyFormat();
        // XML生成
        org.jdom2.output.XMLOutputter xmlOutputter = new org.jdom2.output.XMLOutputter(pf);
        try {
            xmlOutputter.output(document, new java.io.FileWriter(new java.io.File("./src/main/resources/phones.xml")));
        } catch (java.io.IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * JDOM解析XML
     */
    static void readWithJDOM() {
        try {
            // 创建解析器
            org.jdom2.input.SAXBuilder saxBuilder = new org.jdom2.input.SAXBuilder();
            org.jdom2.Document document = saxBuilder.build(resource);
            // 获取根节点
            org.jdom2.Element rootElement = document.getRootElement();
            System.out.println("根节点: " + rootElement.getName());

            // 获取根节点下所有子节点
            java.util.List<org.jdom2.Element> nodes = rootElement.getChildren();
            for (org.jdom2.Element element : nodes) {
                System.out.println("节点::" + element.getName());

                // 获取当前节点下所有子节点
                for (org.jdom2.Element item : element.getChildren()) {
                    System.out.println(item.getName() + " :: " + item.getValue());

                    // 获取当前节点下所有属性
                    for (org.jdom2.Attribute attribute : item.getAttributes()) {
                        System.out.println(attribute.getName() + " = " + attribute.getValue());
                    }
                }
            }
        } catch (org.jdom2.JDOMException e) {
            e.printStackTrace();
        } catch (java.io.IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * SAX生成XML
     */
    static void writeWithSAX() {
        try {
            javax.xml.transform.sax.SAXTransformerFactory saxTransformerFactory = (javax.xml.transform.sax.SAXTransformerFactory) javax.xml.transform.sax.SAXTransformerFactory
                    .newInstance();
            javax.xml.transform.sax.TransformerHandler transformerHandler = saxTransformerFactory
                    .newTransformerHandler();
            transformerHandler.setResult(
                    new javax.xml.transform.stream.StreamResult(new java.io.File("./src/main/resources/cars.xml")));
            javax.xml.transform.Transformer transformer = transformerHandler.getTransformer();
            transformer.setOutputProperty(javax.xml.transform.OutputKeys.VERSION, "1.0");
            transformer.setOutputProperty(javax.xml.transform.OutputKeys.ENCODING, "UTF-8");

            transformerHandler.startDocument();
            transformerHandler.startElement("", "", "cars", null);
            transformerHandler.startElement("", "", "car", null);
            transformerHandler.startElement("", "", "name", null);
            String text = "斯巴鲁";
            transformerHandler.characters(text.toCharArray(), 0, text.length());
            transformerHandler.endElement("", "", "name");
            transformerHandler.startElement("", "", "price", null);
            text = "250000";
            transformerHandler.characters(text.toCharArray(), 0, text.length());
            transformerHandler.endElement("", "", "price");
            transformerHandler.endElement("", "", "car");
            transformerHandler.endElement("", "", "cars");
            transformerHandler.endDocument();
        } catch (javax.xml.transform.TransformerConfigurationException e) {
            e.printStackTrace();
        } catch (javax.xml.transform.TransformerFactoryConfigurationError e) {
            e.printStackTrace();
        } catch (org.xml.sax.SAXException e) {
            e.printStackTrace();
        }
    }

    /**
     * SAX解析XML
     */
    static void readWithSAX() {
        try {
            javax.xml.parsers.SAXParserFactory saxParserFactory = javax.xml.parsers.SAXParserFactory.newInstance();
            javax.xml.parsers.SAXParser saxParser = saxParserFactory.newSAXParser();
            saxParser.parse(resource, new org.xml.sax.helpers.DefaultHandler() {

                @Override
                public void startDocument() throws org.xml.sax.SAXException {
                    super.startDocument();
                    System.out.println("#########startDocument()");
                }

                @Override
                public void endDocument() throws org.xml.sax.SAXException {
                    super.endDocument();
                    System.out.println("#######endDocument()");
                }

                @Override
                public void startElement(String uri, String localName, String qName, org.xml.sax.Attributes attributes)
                        throws org.xml.sax.SAXException {
                    super.startElement(uri, localName, qName, attributes);
                    System.out.println("节点名:" + qName);

                    for (int i = 0; i < attributes.getLength(); i++) {
                        System.out.println("属性: " + attributes.getValue(i));
                    }
                }

                @Override
                public void endElement(String uri, String localName, String qName) throws org.xml.sax.SAXException {
                    super.endElement(uri, localName, qName);
                }

                @Override
                public void characters(char[] ch, int start, int length) throws org.xml.sax.SAXException {
                    super.characters(ch, start, length);
                    System.out.println("节点内容: " + new String(ch, start, length));
                }

                @Override
                public void skippedEntity(String name) throws org.xml.sax.SAXException {
                    super.skippedEntity(name);
                }

            });
        } catch (javax.xml.parsers.ParserConfigurationException e) {
            e.printStackTrace();
        } catch (org.xml.sax.SAXException e) {
            e.printStackTrace();
        } catch (java.io.IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * DOM生成XML
     */
    static void writeWithDOM() {
        try {
            // 得到 DOM 解析器的工厂实例
            javax.xml.parsers.DocumentBuilderFactory dbf = javax.xml.parsers.DocumentBuilderFactory.newInstance();
            // 从 DOM 工厂中获得 DOM 解析器
            javax.xml.parsers.DocumentBuilder db = dbf.newDocumentBuilder();
            // 创建文档对象
            org.w3c.dom.Document document = db.newDocument();
            // 创建根节点
            org.w3c.dom.Element rootElement = document.createElement("students");

            // 创建节点student
            org.w3c.dom.Element studentElement = document.createElement("student");
            // 创建节点name
            org.w3c.dom.Element nameElement = document.createElement("name");
            // 为节点name设置文本内容
            nameElement.setTextContent("周星星");
            // 为节点name设置属性sex="男"
            nameElement.setAttribute("sex", "男");
            // 将name节点添加至student节点
            studentElement.appendChild(nameElement);
            // 创建节点sno
            org.w3c.dom.Element snoElement = document.createElement("sno");
            // 为sno节点设置文本内容
            snoElement.setTextContent("9527");
            // 将sno节点添加至student节点
            studentElement.appendChild(snoElement);
            // 创建节点id
            org.w3c.dom.Element idElement = document.createElement("id");
            // 为节点id设置文本内容
            idElement.setTextContent("111111111111");
            // 将id节点添加至student节点
            studentElement.appendChild(idElement);

            // 将student节点添加至根节点
            rootElement.appendChild(studentElement);

            // 获取 TransformerFactory 的实例
            javax.xml.transform.TransformerFactory tf = javax.xml.transform.TransformerFactory.newInstance();
            // 获取 Transformer
            javax.xml.transform.Transformer transformer = tf.newTransformer();
            // 转化输出
            transformer.transform(new javax.xml.transform.dom.DOMSource(rootElement),
                    new javax.xml.transform.stream.StreamResult(new java.io.File("./src/main/resources/students.xml")));
        } catch (org.w3c.dom.DOMException e) {
            e.printStackTrace();
        } catch (javax.xml.transform.TransformerConfigurationException e) {
            e.printStackTrace();
        } catch (javax.xml.parsers.ParserConfigurationException e) {
            e.printStackTrace();
        } catch (javax.xml.transform.TransformerFactoryConfigurationError e) {
            e.printStackTrace();
        } catch (javax.xml.transform.TransformerException e) {
            e.printStackTrace();
        }
    }

    /**
     * DOM解析文件
     */
    static void readWithDOM() {
        try {
            // 得到 DOM 解析器的工厂实例
            javax.xml.parsers.DocumentBuilderFactory dbf = javax.xml.parsers.DocumentBuilderFactory.newInstance();
            // 从 DOM 工厂中获得 DOM 解析器
            javax.xml.parsers.DocumentBuilder db = dbf.newDocumentBuilder();
            // 解析XML文件
            org.w3c.dom.Document doc = db.parse(resource);
            // 获取根节点
            org.w3c.dom.Element rootElement = doc.getDocumentElement();
            // 获取根节点的节点名称
            System.out.println("根节点名: " + rootElement.getNodeName());
            // 获取根节点下第一个元素节点的节点名
            System.out.println("根节点下第一个元素节点 :" + rootElement.getFirstChild().getNextSibling().getNodeName());
            // 获取根节点下最后一个元素节点的节点名
            System.out.println("根节点下最后一个元素节点 :" + rootElement.getLastChild().getPreviousSibling().getNodeName());

            // 获取根节点下所有子节点
            org.w3c.dom.NodeList nodes = rootElement.getChildNodes();
            for (int i = 0; i < nodes.getLength(); i++) {
                org.w3c.dom.Node bookNode = nodes.item(i);
                // 若为空文本节点,忽略
                if (org.w3c.dom.Node.TEXT_NODE == bookNode.getNodeType()) {
                    continue;
                }

                // 获取节点名称
                System.out.println("子节点: " + bookNode.getNodeName());

                // 获取当前节点下所有子节点
                org.w3c.dom.NodeList records = bookNode.getChildNodes();
                for (int j = 0; j < records.getLength(); j++) {
                    org.w3c.dom.Node record = records.item(j);
                    // 若为空文本节点,忽略
                    if (org.w3c.dom.Node.TEXT_NODE == record.getNodeType()) {
                        continue;
                    }

                    // 获取当前节点的文本内容
                    System.out.println(record.getNodeName() + " : " + record.getFirstChild().getNodeValue());

                    // 获取当前元素节点下所有属性
                    org.w3c.dom.NamedNodeMap attributes = record.getAttributes();
                    if (null != attributes && attributes.getLength() > 0) {
                        for (int k = 0; k < attributes.getLength(); k++) {
                            org.w3c.dom.Node attr = attributes.item(k);
                            // 获取属性名、属性值
                            System.out.println(attr.getNodeName() + "  ::  " + attr.getNodeValue());
                        }
                    }
                }
            }
        } catch (javax.xml.parsers.ParserConfigurationException e) {
            e.printStackTrace();
        } catch (java.io.FileNotFoundException e) {
            e.printStackTrace();
        } catch (org.xml.sax.SAXException e) {
            e.printStackTrace();
        } catch (java.io.IOException e) {
            e.printStackTrace();
        }
    }

}

猜你喜欢

转载自blog.csdn.net/footprint01/article/details/82593712