前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >xml解析系列(一)——用dom4j解析xml

xml解析系列(一)——用dom4j解析xml

作者头像
逝兮诚
发布2019-10-30 13:41:29
2.8K0
发布2019-10-30 13:41:29
举报
文章被收录于专栏:代码人生代码人生

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/luo4105/article/details/74518205

该系列代码都在https://code.csdn.net/luo4105/study_http项目的com.lc.xml包中

两种XML解析方式简介

Xml读取解析有两种方式,dom和sax。SAX可以快速扫描一个大型的XML文档,当它找到查询标准时就会立即停止,然后再处理之。DOM是把XML全部加载到内存中建立一棵树之后再进行处理。所以DOM不适合处理大型的XML【会产生内存的急剧膨胀】。

dom和sax区别

dom解析是直接把xml一个parse操作,转成了document对象,简单粗暴,不过这样会耗费很多内存的资源。所以,在临床上我们一般只用来读一些配置文件或者比较小的xml文件

sax解析则是一个节点一个节点得往下读,读到后面的,前面的也就释放掉了,所以不会存在说耗费大量内存一说。所以对大型的xml文件用sax解析就再好不过了。

Marshaller和Unmarshaller可以直接实现javabean和xml的相互转换,强大、简单、使用。

Java常用的解析技术有两种, dom4j、Marshaller和Unmarshaller。Marshaller和Unmarshaller是jdk自带的,不需要引入jar包。Marshaller和Unmarshaller可以方便实现xml与javabean之间的转换,适合于xml格式固定的解析。dom4j适合xml结构不不统一、需要自定义的xml解析。

dom4j

dom4j需要添加dom4j.jar包,这里通过写和读的例子来讲解dom4j。

mvn依赖

代码语言:javascript
复制
<dependency>
    <groupId>dom4j</groupId>
    <artifactId>dom4j</artifactId>
    <version>1.6.1</version>
</dependency>

Document初始化

解析xml的过程是通过创建Document对象,然后根据Document对象操作xml,所以初始化Document是第一步、下面是最常用的三种初始化创建方式。

(1) 手动创建Document对象

代码语言:javascript
复制
代码语言:javascript
复制
Document document = DocumentHelper.createDocument();

(2) 加载xml文件创建Document对象

代码语言:javascript
复制
代码语言:javascript
复制
SAXReader reader = new SAXReader();
Document document = reader.read(new File("src/main/resources/blog-data.xml"));

(3) 通过xml内容字符串创建Document对象

代码语言:javascript
复制
代码语言:javascript
复制
String xmlStr = "<students>......</students>";
Document document = DocumentHelper.parseText(xmlStr);

XML的写入

Element是xml中节点对象,Element常见操作有

1.添加节点

代码语言:javascript
复制
.addElement("");

2.设置数据

代码语言:javascript
复制
. addText("");

3.添加属性

代码语言:javascript
复制
.addAttribute("","");

下面是一个java创建Document对象并输出到xml文件的程序。

代码语言:javascript
复制
代码语言:javascript
复制
@Test
public void xmlWriteByNIO() throws Exception {
    Document document = DocumentHelper.createDocument();
    Element root = document.addElement("bloginfos");
root.addAttribute("id", "12");
    Element info = root.addElement("bloginfo");
    Element name = info.addElement("name");
    name.addText("NIO系列(六)——pipe");
    Element url = info.addElement("url");
    url.addText("http://blog.csdn.net/luo4105/article/details/73650562");
    System.out.println(document.asXML());
    RandomAccessFile aFile = new RandomAccessFile("src/main/resources/blog-data.xml", "rw");
    FileChannel inChannel = aFile.getChannel();
    byte[] picbytes = document.asXML().getBytes("UTF-8");
    ByteBuffer xmlDataBuf = ByteBuffer.wrap(picbytes);
    while (xmlDataBuf.hasRemaining()){
        inChannel.write(xmlDataBuf);
    }
}

打开xml

代码语言:javascript
复制
代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<bloginfos id="12"><bloginfo><name>NIO系列(六)——pipe</name><url>http://blog.csdn.net/luo4105/article/details/73650562</url></bloginfo></bloginfos>

可以使用OutputFormat对xml进行格式化输出,例子经过格式化修改如下

代码语言:javascript
复制
代码语言:javascript
复制
@Test
public void xmlWrite() throws Exception {
    Document document = DocumentHelper.createDocument();
    Element root = document.addElement("bloginfos");
    root.addAttribute("id", "12");
    Element info = root.addElement("bloginfo");
    Element name = info.addElement("name");
    name.addText("NIO系列(六)——pipe");
    Element url = info.addElement("url");
    url.addText("http://blog.csdn.net/luo4105/article/details/73650562");

    StringWriter writer = new StringWriter();
    OutputFormat format = OutputFormat.createPrettyPrint();
    format.setNewlines(true);
    // 生成缩进
    format.setIndent(true);
    // 使用4个空格进行缩进, 可以兼容文本编辑器
    format.setIndent("    ");
    format.setEncoding("UTF-8");
    XMLWriter xmlwriter = new XMLWriter(writer, format);
    xmlwriter.write(document);

    System.out.println(writer.toString());
    RandomAccessFile aFile = new RandomAccessFile("src/main/resources/blog-data.xml", "rw");
    FileChannel inChannel = aFile.getChannel();
    inChannel.truncate(0);
    byte[] picbytes = writer.toString().getBytes("UTF-8");
    ByteBuffer xmlDataBuf = ByteBuffer.wrap(picbytes);
    while (xmlDataBuf.hasRemaining()){
        inChannel.write(xmlDataBuf);
    }
}

输出结果

代码语言:javascript
复制
代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>

<bloginfos id="12">
    <bloginfo>
        <name>NIO系列(六)——pipe</name>
        <url>http://blog.csdn.net/luo4105/article/details/73650562</url>
    </bloginfo>
</bloginfos>

XML的读取

同样是通过Element来读取数据,常用的方法有

1.获得子节点

代码语言:javascript
复制
代码语言:javascript
复制
.elements();

2.获得节点名

代码语言:javascript
复制
代码语言:javascript
复制
.getName()

3.获得节点属性

代码语言:javascript
复制
代码语言:javascript
复制
.attributes()

4.获得节点text

代码语言:javascript
复制
代码语言:javascript
复制
.getText()

下面是一个读取xml数据的例子

代码语言:javascript
复制
代码语言:javascript
复制
@Test
public void xmlRead() throws DocumentException {
    SAXReader reader = new SAXReader();
    Document document = reader.read(new File("src/main/resources/blog-data.xml"));
    Element root = document.getRootElement();
    System.out.println("当前节点名称:" + root.getName());
    List<Attribute> list = root.attributes();
    for(Attribute attribute : list) {
        System.out.println("属性名" + attribute.getName() + ",值" + attribute.getValue());
    }
    List<Element> elements = root.elements();
    for (Element element : elements) {
        System.out.println("当前节点名称:" + element.getName());
        List<Element> elements2 = element.elements();
        for (Element element2 : elements2){
            System.out.println("当前节点名称:" + element2.getName());
            System.out.println("当前节点数据:" + element2.getText());
        }
    }
}

运行结果

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017-07-06 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 两种XML解析方式简介
  • dom4j
    • mvn依赖
      • Document初始化
        • XML的写入
          • XML的读取
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档