`
dyy_gusi
  • 浏览: 207044 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Java解析XML文件的两种方式详解

    博客分类:
  • Java
阅读更多

Java解析XML文件:
常规的两种方式:dom4j方式+jdom方式
1.要解析的xml文件

<?xml version="1.0" encoding="utf-8"?>
<books>
    <book name="ThinkInJava">
        <language>english</language>
        <price>60.0</price>
    </book>
    <book name="Java编程思想">
        <language>chinese</language>
        <price>75.0</price>
    </book>
</books>

 
2.dom4j方式:需要用dom4j.jar包

public class Dom4jXML {

    public Dom4jXML() {
    }

    public void praseXML(String filePath) {
        SAXReader reader = new SAXReader();// 创建一个能读取xml文档的reader
        Document document;// 构建一个文档对象,用来将xml转换成Document对象
        try {
            document = reader.read(new FileInputStream(new File(filePath)));// 从给定的文件中读取xml并且构建成Document
            Element rootElement = document.getRootElement();// 获得文档对象的根节点
            List<Element> listElement = rootElement.elements();// 获得根节点下面所有的子节点
            for (Element e : listElement) {// 遍历所有的子节点
                Element element = e;// 当前节点,也就是Book节点
                Attribute nameAttribute = element.attribute("name");// 得到当前节点的属性对象
                String nameString = nameAttribute.getValue();// 获得属性对象的值
                System.out.println(element.getName() + ":" + nameString);// 将节点信息输出

                Element languageElement = element.element("language");// 获得当前节点的language子节点
                System.out.println(languageElement.getName() + ":" + languageElement.getTextTrim());// 将language节点信息输出

                Element priceElement = element.element("price");
                System.out.println(priceElement.getName() + ":" + priceElement.getText());

                // 判断有没有出版年份节点,要是有就打印出来,要是没有就创建并且添加到Document对象中(添加节点)
                Element yearElement = element.element("year");
                if (yearElement == null) {
                    yearElement = element.addElement("year");
                    yearElement.setText("2014year");
                } else {
                    System.out.println(yearElement.getName() + ":" + yearElement.getTextTrim());
                }

                // 通货膨胀,导致中国物价上涨,凡是汉语书籍涨价10.00元(修改节点)
                if (languageElement.getTextTrim().equals("chinese")) {
                    String priceStr = priceElement.getTextTrim();
                    double priceNum = Double.parseDouble(priceStr);
                    priceNum += 10.00;
                    priceElement.setText(priceNum + "");
                }

            }
            // 将修改以后的Document对象保存成xml到原来的地方
            XMLWriter write = new XMLWriter(new FileWriter(filePath));
            write.write(document);
            write.close();
        } catch (DocumentException e) {
            e.printStackTrace();
        } catch (IOException e1) {
            e1.printStackTrace();
        }
    }

    public static void main(String[] args) {
        new Dom4jXML().praseXML("你自己的xml路径");
    }
}

 
3.jdom方式:需要用到jdom.jar包

public class JdomXML {
    public JdomXML() {
    }

    public void parseXML(String filePath) {
        SAXBuilder builder = new SAXBuilder(false);// 用来读取xml文件
        Document document;// 构建一个文档对象,用来将xml转换成Document对象
        try {
            document = builder.build(new FileInputStream(new File(filePath)));// 从给定的文件中读取xml并且构建成Document
            Element elementRoot = document.getRootElement();// 获得文档对象的根节点
            List<Element> elementList = elementRoot.getChildren("book");// 获得根节点下面所有的Book节点
            for (Element e : elementList) {// 遍历Book节点
                Element element = e;// 当前的Book节点
                String name = element.getAttributeValue("name");// 获得Book节点的name属性

                Element languageElement = element.getChild("language");// 获得Book节点下的language子节点
                String language = languageElement.getValue();// 获得language节点的值

                Element priceElement = element.getChild("price");
                String price = priceElement.getValue();

                // 打印输出子节点相关信息
                System.out.println(element.getName() + ":" + name);
                System.out.println(languageElement.getName() + ":" + language);
                System.out.println(priceElement.getName() + ":" + price);

                // 判断有没有出版年份节点,要是有就打印出来,要是没有就创建并且添加到Document对象中(添加节点)
                Element yearElement = element.getChild("year");
                if (yearElement == null) {
                    yearElement = new Element("year");
                    yearElement.setText("2014year");
                    element.addContent(yearElement);
                } else {
                    System.out.println(yearElement.getName() + ":" + yearElement.getValue());
                }

                // 判断是不是外文书籍,要是外文书籍,就降价1.50元(修改节点)
                if (language.equals("english")) {
                    double priceNum = Double.parseDouble(price);
                    priceNum -= 1.50;
                    priceElement.setText(priceNum + "");
                }
            }
            // 将修改以后的Document对象保存成xml到原来的地方
            XMLOutputter outputter = new XMLOutputter();
            outputter.output(document, new FileOutputStream(new File(filePath)));
        } catch (JDOMException | IOException e) {
            e.printStackTrace();
        }

    }

    public static void main(String[] args) {
        new JdomXML().parseXML("你自己的xml路径");
    }
}

 
说明:两种方式都是可以的,原理基本相同。语法略有不同,但是还是都很好理解。
可以使用这种方法完成一个自己的Spring的IOC的功能玩玩。

6
1
分享到:
评论
1 楼 kt431128 2013-12-28  
能不能详细说以下这两种解析方式在性能上的优缺点了?数据量也别大的情况下哪种方式解析性能会好点了?谢谢。

相关推荐

    详 解Java解析XML

    详解Java解析XML的四种方法详解Java解析XML的四种方法详解Java解析XML的四种方法详解Java解析XML的四种方法详解Java解析XML的四种方法

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part2

    第14章 jsp开发的两种模型 441 14.1 模型1 441 14.2 模型2 445 14.3 小结 449 第15章 标签库(tag library) 450 15.1 标签库api 450 15.1.1 标签的形式 451 15.1.2 tag接口 451 15.1.3 iterationtag接口 ...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part3

    第14章 jsp开发的两种模型 441 14.1 模型1 441 14.2 模型2 445 14.3 小结 449 第15章 标签库(tag library) 450 15.1 标签库api 450 15.1.1 标签的形式 451 15.1.2 tag接口 451 15.1.3 iterationtag接口 ...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part4

    第14章 jsp开发的两种模型 441 14.1 模型1 441 14.2 模型2 445 14.3 小结 449 第15章 标签库(tag library) 450 15.1 标签库api 450 15.1.1 标签的形式 451 15.1.2 tag接口 451 15.1.3 iterationtag接口 ...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part5

    第14章 jsp开发的两种模型 441 14.1 模型1 441 14.2 模型2 445 14.3 小结 449 第15章 标签库(tag library) 450 15.1 标签库api 450 15.1.1 标签的形式 451 15.1.2 tag接口 451 15.1.3 iterationtag接口 ...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (1)

    12.4.1 Hibernate的两种配置方式 12.4.2 配置数据库连接池 12.4.3 使用JNDI 12.5 使用Hibernate的工具快速生成映射文件和POJO 12.5.1 使用MiddleGen根据数据库产生映射文件 12.5.2 使用hbm2java根据映射文件产生POJO...

    《程序天下:J2EE整合详解与典型案例》光盘源码

    12.4.1 Hibernate的两种配置方式 12.4.2 配置数据库连接池 12.4.3 使用JNDI 12.5 使用Hibernate的工具快速生成映射文件和POJO 12.5.1 使用MiddleGen根据数据库产生映射文件 12.5.2 使用hbm2java根据映射文件产生POJO...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (2)

    12.4.1 Hibernate的两种配置方式 12.4.2 配置数据库连接池 12.4.3 使用JNDI 12.5 使用Hibernate的工具快速生成映射文件和POJO 12.5.1 使用MiddleGen根据数据库产生映射文件 12.5.2 使用hbm2java根据映射文件产生POJO...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (3)

    12.4.1 Hibernate的两种配置方式 12.4.2 配置数据库连接池 12.4.3 使用JNDI 12.5 使用Hibernate的工具快速生成映射文件和POJO 12.5.1 使用MiddleGen根据数据库产生映射文件 12.5.2 使用hbm2java根据映射文件产生POJO...

    php的webservice的wsdl的XML无法显示问题的解决方法

    JAVA如何调用wsdl过程详解java WSDL接口webService实现方式PHP调用wsdl文件类型的接口代码分享解析利用wsdl.exe生成webservice代理类的详解在PHP中利用wsdl创建标准webservice的实现代码Java调用CXF WebService接口...

    Android xml实现animation的4种动画效果实例代码

    animation有四种动画类型:分别为alpha(透明的渐变)、rotate(旋转)、scale(尺寸伸缩)、translate(移动),二实现的分发有两种,一种是javaCode,另外一种是XML,而我今天要说的是XML实现的方法,个人感觉javaCode的...

    javascript解析json格式的数据方法详解

    在json中,有两种结构:对象和数组。 一个对象以“{”(左括号)开始,“}”(右括号)结束。每个“名称”后跟一个“:”(冒号);“‘名称/值’ 对”之间运用 “,”(逗号)分隔。 名称用引号括起来;值如果是字符...

    J2EE应用开发详解

    316 17.7 小结 318 第18章 Hibernate 319 18.1 Hibernate体系结构 319 18.2 Hibernate核心接口 321 18.3 一个简单的Hibernate例子 321 18.4 详解Hibernate配置文件 325 18.4.1 Hibernate的两种配置方式 325 18.4.2 ...

    ActionScript 3.0 API文档及Flex开发详解电子书

    对C语言、Java语言/JavaEE系统、Ruby on Rails、Flex、Ajax等领域都有深入的研究:国内第一个Flex企业级上线项目核心开发者,属于国内最早一批应用Flex进行企业级开发的软件工程师;国内第一批Ruly on Rails架构的...

    JAVA核心知识点整理(有效)

    25 JAVA8 与元数据.................................................................................................................................25 2.4. 垃圾回收与算法 .................................

    iuhyiuhkjh908u0980

    安装ivy主要有两种方式,手工安装或者自动安装。 1) 手工安装 从这里下载你想要的版本,在任何你想的地方解开下载的zip文件,并复制ivy的jar文件到你的ant的lib目录(ANT_HOME/lib). 如果你使用ant 1.6.0或者更高,你...

    asp.net知识库

    Asp.Net(C#)利用XPath解析XML文档示例 XSL .Net框架下的XSLT转换技术简介 一个XSLT的简单例子 XSLXSLT板主题整理 xsl入门的好文章 新手学习XSL的好东西 XSL语法介绍 XSL学习心得 - 调用属性值 XSLT与XML转换的详细...

    黑马程序员 安卓学院 万元哥项目经理 分享220个代码实例

    |--xml文件的pull解析与序列化写入 |--xml的封装序列化 |--任务循环之只在Activity显示时执行 |--修改文件的最后修改时间 |--偏好设置(回显) |--内存优化之各种方法 |--内容提供者之短信的序列化对象读写 |--内容...

Global site tag (gtag.js) - Google Analytics