Java操作XML(1)--DOM方式处理XML

XML DOM定义了访问和处理XML文档的标准方法,DOM是W3C(万维网联盟)的推荐标准。本文主要介绍Java DOM方式处理XML,文中所使用到的软件版本:Java 1.8.0_191、jaxen 1.2.0。

1、DOM简介

       DOM的全称是Document Object Model,也即文档对象模型。在应用程序中,基于DOM的XML分析器将一个XML文档转换成一个对象模型的集合(通常称DOM树),应用程序正是通过对这个对象模型的操作,来实现对XML文档数据的操作。通过DOM接口,应用程序可以在任何时候访问XML文档中的任何一部分数据,因此,这种利用DOM接口的机制也被称作随机访问机制。
  DOM接口提供了一种通过分层对象模型来访问XML文档信息的方式,这些分层对象模型依据XML的文档结构形成了一棵节点树。无论XML文档中所描述的是什么类型的信息,即便是制表数据、项目列表或一个文档,利用DOM所生成的模型都是节点树的形式。也就是说,DOM强制使用树模型来访问XML文档中的信息。由于XML本质上就是一种分层结构,所以这种描述方法是相当有效的。
  DOM树所提供的随机访问方式给应用程序的开发带来了很大的灵活性,它可以任意地控制整个XML文档中的内容。然而,由于DOM分析器把整个XML文档转化成DOM树放在了内存中,因此,当文档比较大或者结构比较复杂时,对内存的需求就比较高。而且,对于结构复杂的树的遍历也是一项耗时的操作。所以,DOM分析器对机器性能的要求比较高,实现效率不十分理想。不过,由于DOM分析器所采用的树结构的思想与XML文档的结构相吻合,同时鉴于随机访问所带来的方便,因此,DOM分析器还是有很广泛的使用价值的。

1.1、DOM的优点

1、可以随意访问文档树的任何部分,没有次数限制。
2、可以随意修改文档树,从而修改XML文档。
3、易于理解,易于开发。

1.2、DOM的缺点

1、在内存中创建文档树,不适于处理大型XML文档。

2、Java DOM方式操作XML

2.1、XML文件

<?xml version="1.0" encoding="utf-8" ?>
<school:class xmlns:school="http://www.w3.org/TR/html4/school/">
    <school:student rollno="1" school:testattr="test">
        <school:firstname>cxx1</school:firstname>
        <lastname>Bob1</lastname>
        <nickname>stars1</nickname>
        <marks>85</marks>
    </school:student>
    <student rollno="2">
        <firstname>cxx2</firstname>
        <lastname>Bob2</lastname>
        <nickname>stars2</nickname>
        <marks>85</marks>
    </student>
    <student rollno="3">
        <firstname>cxx3</firstname>
        <lastname>Bob3</lastname>
        <nickname>stars3</nickname>
        <marks>85</marks>
    </student>
</school:class>

2.2、Java代码例子

该例子演示了使用DOM方式解析XML、DOM方式下XPath的使用以及使用DOM方式来生成XML。

package com.abc.demo.general.xml;

import org.jdom2.*;
import org.jdom2.filter.Filter;
import org.jdom2.filter.Filters;
import org.jdom2.input.SAXBuilder;
import org.jdom2.output.Format;
import org.jdom2.output.XMLOutputter;
import org.jdom2.xpath.XPathBuilder;
import org.jdom2.xpath.XPathExpression;
import org.jdom2.xpath.XPathFactory;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.ByteArrayOutputStream;
import java.util.List;

/**
 * 使用JDOM处理xml
 */
public class JDomCase {
    private static Logger logger = LoggerFactory.getLogger(DomCase.class);

    /**
     * 解析xml
     * @throws Exception
     */
    @Test
    public void parse() throws Exception {
        SAXBuilder sb = new SAXBuilder();
        Document document = sb.build(DomCase.class.getResourceAsStream("student.xml"));
        Element root = document.getRootElement();

        Namespace namespace = Namespace.getNamespace("school", "http://www.w3.org/TR/html4/school/");
        List<Element> list = root.getChildren("student", namespace);//第1位学生
        for (int i = 0; i < list.size(); i++) {
            Element student = list.get(i);
            logger.info("学生编号{}", student.getAttributeValue("rollno"));
            logger.info("testattr:{}", student.getAttributeValue("testattr", namespace));
            logger.info("firstname:{}", student.getChildText("firstname", namespace));
            logger.info("lastname:{}", student.getChildText("lastname"));
            logger.info("nickname:{}", student.getChildText("nickname"));
            logger.info("marks:{}", student.getChildText("marks"));
        }

        list = root.getChildren("student");//第2、3位学生
        for (int i = 0; i < list.size(); i++) {
            Element student = list.get(i);
            logger.info("学生编号{}",student.getAttributeValue("rollno"));
            logger.info("firstname:{}", student.getChildText("firstname"));
            logger.info("lastname:{}", student.getChildText("lastname"));
            logger.info("nickname:{}", student.getChildText("nickname"));
            logger.info("marks:{}", student.getChildText("marks"));
        }
    }

    /**
     * xpath使用
     * @throws Exception
     */
    @Test
    public void xpath() throws Exception {
        SAXBuilder sb = new SAXBuilder();
        Document document = sb.build(DomCase.class.getResourceAsStream("student.xml"));
        Namespace namespace = Namespace.getNamespace("school", "http://www.w3.org/TR/html4/school/");

        Filter<Text> filter = Filters.text();
        logger.info("查找所有的存在rollno属性的student节点,取出lastname的值");
        XPathBuilder<Text> builder = new XPathBuilder<Text>("//student[@rollno]/lastname/text()", filter);//第2、3位学生
//        XPathBuilder<Text> builder = new XPathBuilder<Text>("//student[@rollno]/child::lastname/text()", filter);//效果同上
//        XPathBuilder<Text> builder = new XPathBuilder<Text>("//school:student[@rollno]/lastname/text()", filter);//第1位学生
        builder.setNamespace(namespace);
        XPathExpression<Text> expression = builder.compileWith(XPathFactory.instance());
        //XPathExpression<Object> expression = XPathFactory.instance().compile("//student[@rollno]/lastname/text()");
        List<Text> list = expression.evaluate(document);
        for (int i = 0; i < list.size(); i++) {
            Text text = list.get(i);
            logger.info(text.getText());
        }
    }

    /**
     * 生成xml
     */
    @Test
    public void toXml() throws Exception {
        Document document = new Document();
        Namespace namespace = Namespace.getNamespace("school", "http://www.w3.org/TR/html4/school/");
        Element root = new Element("class", namespace);
        document.setRootElement(root);
        //第一个学生
        Element student = new Element("student", namespace);
        student.setAttribute(new Attribute("rollno", "1"));
        student.setAttribute(new Attribute("testattr", "test", namespace));
        Element firstname = new Element("firstname", namespace).setText("cxx1");
        Element lastname = new Element("lastname").setText("Bob1");
        Element nickname = new Element("nickname").setText("stars1");
        Element marks = new Element("marks").setText("85");

        student.addContent(firstname);
        student.addContent(lastname);
        student.addContent(nickname);
        student.addContent(marks);
        root.addContent(student);

        //第二个学生
        student = new Element("student");
        student.setAttribute(new Attribute("rollno", "2"));
        firstname = new Element("firstname", namespace).setText("cxx2");
        lastname = new Element("lastname").setText("Bob2");
        nickname = new Element("nickname").setText("stars2");
        marks = new Element("marks").setText("85");

        student.addContent(firstname);
        student.addContent(lastname);
        student.addContent(nickname);
        student.addContent(marks);
        root.addContent(student);

        //第三个学生
        student = new Element("student");
        student.setAttribute(new Attribute("rollno", "3"));
        firstname = new Element("firstname", namespace).setText("cxx3");
        lastname = new Element("lastname").setText("Bob3");
        nickname = new Element("nickname").setText("stars3");
        marks = new Element("marks").setText("85");

        student.addContent(firstname);
        student.addContent(lastname);
        student.addContent(nickname);
        student.addContent(marks);
        root.addContent(student);

        XMLOutputter xmlOutput = new XMLOutputter();
        //xml格式化
        Format format = Format.getRawFormat();
        //文本缩进
        format.setIndent("  ");
        format.setTextMode(Format.TextMode.TRIM_FULL_WHITE);
        xmlOutput.setFormat(format);
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        xmlOutput.output(document, out);
        logger.info(out.toString());
    }
}
原文地址:https://www.cnblogs.com/wuyongyin/p/14266756.html