必威体育Betway必威体育官网
当前位置:首页 > IT技术

解析XML文件(一)

时间:2019-10-18 00:42:17来源:IT技术作者:seo实验室小编阅读:79次「手机版」
 

解析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如下:

DocumentDocumentHelper.createDocument()

XMLWriterxmlWriter = 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如下:

DocumentDocumentHelper.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如下:

SAXReadernew SAXReader();

Documentnew 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如下:

ElementgetRootElement()

StringgetName()

Listelements(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如下:

StringattributeValue(String attributeName)

Elementelement(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);

相关阅读

淘宝退款淘金币会退吗?淘金币抵钱常见问题解析

淘宝退款是淘宝交易中经常有的事情,如果买家退款,淘宝金币会不会退回呢?有人问淘宝退款淘金币会退吗?针对这两个问题,小编从两方面跟

社交媒体营销深度解析

在本文中,笔者重点介绍他的一些发现和社交媒体策略,帮助营销人员通过B2B营销&ldquo;漏斗&rdquo;,以各种渠道找到正确的受众,分享经验

【原】115网盘下载地址解析工具(暂停更新)

原文地址为:【原】115网盘下载地址解析工具(暂停更新)115网盘的优点不必多说,跨运营商多线路、无须下载工具即可高速下载、直接下载地

关于offsetof(s,m)的解析

关于offsetof(s,m)的解析在一些库的写法中,我们有时会看到如下的宏定义:#define OFFSETOF(s,m) ((INT32U)&(((s *)0->m))其作用其实是

Andorid-Tint使用与原理解析

转自:https://blog.csdn.net/zhuoxiuwu/article/details/50976337 Android Tint使用 Tint 属性 Tint 是 Android5.0 引入的一

分享到:

栏目导航

推荐阅读

热门阅读