解析XML文件(一)

解析XML(一)

  • 在进行XML文件的解析之前,我们简单介绍下什么是XML,以及XML在企业中有哪些作用。(本文建立在不使用数据库的前提之下,如果你正在使用数据库,或许并不需要学习本文)

  • 什么是XML?

    • XML指可拓展标记语言

    • XML是一种标记语言,很类似HTML

    • XML的设计宗旨是传输数据,而非显示数据(显示数据应使用HTML及CSS)

    • XML标签没有被预定义 (意味着你可以创建出任何命名的标签,例如<QQ></QQ>,而HTML中并无此标签,但是建议尽可能少的使用中文)

  • XML有如下作用:

    • 存储数据

    • 传递数据,即服务器以XML的形式传输数据

    • 软件配置,即通过配置XML文件,通知应用程序如何处理业务

在进行简单的介绍之后,我们便直接奔入主题吧。但在解析前,我们还需要下载并导入第三方jar包:dom4j-1.6.1.jar,该包是一种开源的XML解析包。


1.创建一个新的XML文件



public static void typ01() throws Exception{

    //创建一个内存对象Document,它就表示硬盘中的xml文件

    Document xmlDocument = DocumentHelper.createDocument();

    //将内存中的对象Document写入硬盘,形成一个xml文件

    XMLWriter xmlWriter = new XMLWriter(new FileOutputStream(new File("D:/new.xml")));

    xmlWriter.write(xmlDocument);

    xmlWriter.close();

}

该文件创建好之后(建议平时使用notepad++),内容如下:

在这里插入图片描述

该文件只包含XML版本解析器,以及编码。

用到的API如下:

Document       DocumentHelper.createDocument()

XMLWriter       xmlWriter = new XMLWriter(OutputStream os)


2.将符合XML格式的字符串转成xml文件



public static void type02()throws Exception{

    //创建符合xml内容的字符串

    String str ="<root><city>西安</city></root>";

    Document xmlDocument = DocumentHelper.parseText(str);

    //将内存中的document对象输出到硬盘,形成一个xml文件

    XMLWriter xmlWriter = new XMLWriter(new FileOutputStream(new File("E:/new.xml")));

    xmlWriter.write(xmlDocument);

    xmlWriter.close();

}

创建好之后,内容如下:

在这里插入图片描述


用到的API如下:

Document       DocumentHelper.parseText(String text);

3.加载已存在的xml文件到内存,形成一个倒状的树结构,根就是Document对象



public static void type03() throws Exception {

    //创建dom4j核心解析器

    SAXReader saxReader = new SAXReader();

    //读取硬盘的xml文件

    Document xmldocument = saxReader.read(new File("E:/2.xml"));

    //判断是否已经读到xml文件

    System.out.println(xmldocument==null?"未读取到xml文件":"已读取到xml文件");

}

用到的API如下:

SAXReader       new SAXReader();

Document         new SAXReader.read(File file);


4.获取根节点的名字并获取根节点下的直接子节点的个数


首先我们在E盘中名为bookstore.xml的文件,内容如下:


<?xml version="1.0" encoding="utf-8" ?>

<bookstore>

    <book id="first">

        <title>JavaWeb</title>

        <author>哈哈</author>

        <price>49</price>

    </book>

    <book id="second">

        <title>Web</title>

        <author>哈哈</author>

        <price>50</price>

    </book>



</bookstore>


public static void main(String[] args)throws Exception {

    //创建dom4j解析器对象

    SAXReader saxReader = new SAXReader();

    //通过字节流加载硬盘中的xml文件到内存

    Document xmlDocument = saxReader.read(new FileInputStream(new File("E:/bookstore.xml")));

    //获取根节点

    Element rootElement = xmlDocument.getRootElement();

    //显示根节点的名字

    System.out.println(rootElement.getName());

    //获取根节点下的直接子节点的个数和名字

    List<Element> list = rootElement.elements("book");

    System.out.println("根节点下有"+list.size()+"直接子节点");

}

输出如下:

在这里插入图片描述

用到的API如下:

Element       getRootElement()

String          getName()

List              elements(String nodeName)


5.解析所有book节点属性值并解析所有book节点下子节点的内容



public static void main(String[] args)throws Exception {

    //创建dom4j解析器对象

    SAXReader saxReader = new SAXReader();

    //通过字节流加载硬盘中的xml文件到内存

    Document xmlDocument = saxReader.read(new FileInputStream(new File("E:\\bookstore.xml")));

    //获取根节点

    Element rootElement = xmlDocument.getRootElement();

    //获取根节点写所有book字节点形成的集合

    List<Element> list = rootElement.elements("book");

    //迭代

    for(Element element : list) {

    //获取book节点的id属性值

    String id = element.attributeValue("id");

    //分别获取book节点的title/author/price子节点的内容

    String title = element.element("title").getText().trim();

    String author = element.element("author").getText().trim();

    String price = element.element("price").getText().trim();

            

    //将来我们可以将上述属性值封装到JavaBean对象中的所有属性中,

    //加入到List<JavaBean>集合中

    System.out.println(id+":"+title+" "+author+" "+price);

    System.out.println("-------");

    }

}

在这里插入图片描述用到的API如下:

String       attributeValue(String attributeName)

Element    element(String nodeName)


6.修改节点的属性、修改节点中的内容并再次写回文件中


该案例通过类加载器读取src中的xml文件,内容如下:

在这里插入图片描述


public class Demo04 {

    public static void main(String[] args) throws Exception {

        //创建dom4j解析器对象

        SAXReader saxReader = new SAXReader();

        //创建InputStream对象

        InputStream is =

                Demo04.class.getClassLoader().getResourceAsStream("bookstore.xml");

        //通过字节流,加载硬盘中的xml文件到内存

        Document xmlDocument = saxReader.read(is);

        //获取根节点

        Element rootElement = xmlDocument.getRootElement();

        //获取根节点下所有book子节点形成的集合

        List<Element> list = rootElement.elements("book");

        //跌倒

        for(Element element : list) {

            //如果book节点的id属性值是"java01"的话

            if(element.attributeValue("id").equals("java01")) {

                //修改book节点的id属性值

                element.addAttribute("id", "java0001");

            }

            //如果book节点子节点price的内容为222的话

            if(element.element("price").getText().equals("222")) {

                //修改book节点price子节点内容

                element.element("price").setText("333");

            }

        }

        //上述修改只在内存中,还得将内存中的document对象写入硬盘

        //紧缩格式:createCompactFormat()

        //优美格式:createPrettyPrint()

        OutputFormat format = OutputFormat.createPrettyPrint();

        //指定xml编码

        //format.setEncoding("gbk");    通常并不使使用该函数

        OutputStream os = new FileOutputStream(new File("D:\\bookstore.xml"));

        XMLWriter xmlWriter = new XMLWriter(os,format);

        xmlWriter.write(xmlDocument);

        xmlWriter.close();

    }

}



文件采用优美格式如下:

在这里插入图片描述文件采用紧缩格式如下:

在这里插入图片描述
用到的API如下:
addAttribute(String attributeName,String attributeValue)
createCompactFormat()
createPrettyPrint()
XMLWriter(OutputStream out,OutputFormat format);

  • 18
    点赞
  • 134
    收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:技术黑板 设计师:CSDN官方博客 返回首页
评论 4

打赏作者

baburwang

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值