• 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());
        }
    }
  • 相关阅读:
    「CH2401」送礼物 解题报告
    IO流总结
    关于Servlet中GET和POST方法的总结
    关于Java-枚举的总结
    JVM原理
    Form表单中method="post/get'的区别
    基于Servlet+JSP+JavaBean开发模式的用户登录注册
    浅谈jsp和servlet的区别
    serialVersionUID作用
    oracle的oci和thin区别
  • 原文地址:https://www.cnblogs.com/wuyongyin/p/14266756.html
Copyright © 2020-2023  润新知