• Java操作XML(5)--使用JDOM处理XML


        JDOM是一个开源项目,它基于树型结构,利用纯JAVA的技术对XML文档实现解析、生成、序列化以及多种操作。本文主要介绍使用JDOM来处理XML,文中所使用到的软件版本:Java 1.8.0_191、JDOM 2.0.6。

    1、前言

        W3C在设计DOM模型时,并不是针对某一种语言而设计,因此为了通用性,加入了许多繁琐而不必要的细节 ,使JAVA程序员在开发XML的应用程序过程中感到不甚方便,因此JDOM作为一种新型的XML解析器应运而生,它不遵循DOM模型,建立了自己独立的一套JDOM模型(注意JDOM决不是DOM扩展,虽然名字差不多,但两者是平行的关系),并提供功能强大使用方便的类库,使JAVA程序员可以更为高效的开发自己的XML应用程序,并极大的减少了代码量。

    2、使用JDOM操作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、引入依赖

    <dependency>
        <groupId>org.jdom</groupId>
        <artifactId>jdom2</artifactId>
        <version>2.0.6</version>
    </dependency>

    2.3、Java代码例子

    该例子演示了使用JDOM解析XML、JDOM中XPath的使用以及使用JDOM来生成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());
        }
    }
  • 相关阅读:
    RWCString 定义 memeroy leak
    打开eclipse报错
    Eclipse 增加php插件
    Shell 字符串的截取
    【转载】Shell判断字符串包含关系的几种方法
    Shell $? $* $@ 等含义
    Shell 获取指定行的内容
    概念性进程
    网络编程
    模块详解
  • 原文地址:https://www.cnblogs.com/wuyongyin/p/14273185.html
Copyright © 2020-2023  润新知