解析XML的几种方式

这篇博客介绍了XML解析的四种方式:dom4j、DOM、SAX和STAX。其中,dom4j和DOM需要将整个XML文档加载到内存,适合小文件但内存要求较高;SAX和STAX则采用流式处理,适用于大文件以提高效率。在实际应用中,dom4j和DOM适合XML文档的修改操作。博客详细讲解了每种方法的使用示例,包括DOM解析XML文件、创建或修改XML内容,以及SAX和STAX的事件驱动解析,强调了命名空间的处理和流式解析的优势。
摘要由CSDN通过智能技术生成

dom4j是第三方公司封装的,dom、sax和stax是jdk提供的。

简单说下区别:dom和dom4j需要把文档都加载到内存中,所以对内存要求比较高

sax和stax不需要加载到内存中,可以实时读取XML。

所以sax和stax在解析大文件的XML时比较有效率。

若要对XML文档进行修改操作时可以选择dom4j和dom。

1. dom4j方法: 

引入依赖:

 <dependency>
            <groupId>dom4j</groupId>
            <artifactId>dom4j</artifactId>
            <version>1.6.1</version>
        </dependency>

自定义工具类:

package com.utils;


import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;

import java.util.HashMap;
import java.util.Map;

/**
 * 解析XML
 */
public class ParseXml {

    /**
     * 解析数据列表的xml
     * @param xmlStr
     * @return
     * @throws DocumentException
     */
    public static String parseSearchXml(String xmlStr) throws DocumentException {
        if (xmlStr==null){
            return null;
        }
        String result=null;
        //把返回的内容解析成XML
        Document document= DocumentHelper.parseText(xmlStr);
        //获取根节点
        Element root;
        root=document.getRootElement();
        //一级一级的获取子节点的内容
        result=root.element("eleName1").element("eleName2").element("eleName3").getText();

        return result;

    }

}

2.JDK自带方法 DOM:

2.1 文件读取

xml文件内容如下:

上图中xml包含<font>标签下包含了两种元素Text元素和Node元素,Text元素包含:<font>标签和<name>标签间的空白,</name>标签和<size>标签间的空白,</size>标签和</font>标签间的空白,Node元素包含<name>和<size>标签两个。

所以若调用下面的rootElement.getChildNodes()方法的长度是5而不是2,因为包含了Text元素,所以可能需要去除此种类型的元素。

 


            DocumentBuilder documentBuilder=documentBuilderFactory.newDocumentBuilder();
            Document document =documentBuilder.parse(new File("/work/xml.xml"));
            //获取根元素
            Element rootElement =document.getDocumentElement();
            //获取该元素下的子元素
            NodeList nodeList =rootElement.getChildNodes();
            System.out.println(nodeList.getLength());
            //NodeList的item方法获取每个Node元素
            for (int i=0;i<nodeList.getLength();i++){
               Node node= nodeList.item(i);
//<font>标签下包含Text和Node两种元素,去除空白元素
               if (! (node instanceof Element)){
                   continue;
               }
               Element element=(Element) node;
               //获取标签名
                String tagName=element.getTagName();
                //若确定该标签下只有一个Text元素时直接调用getFirstChild方法即可
                Text text =(Text)element.getFirstChild();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值