XML文件解析-DOM4J方式和SAX方式

最近遇到的工作内容都是和xml内容解析相关的.

1图片数据以base64编码的方式保存在xml的一个标签中,xml文件通过接口的方式发送给我,然后我去解析出图片数据,对图片进行进一步处理.

2.xml内容保存在blob字段中,然后jdbc读取blob字段获取xml内容进行解析.

解析的方法挺简单的,网上有很多种,主要有SAX,DOM4J等.

先来揭晓一下DOM4J是如何解析xml文件的,话不多少,直接上码.

    /**
     * 获取xml文件绝对路径
     */
    private String getFilePath() {
        String fileName = "test.xml";
        String filePath = System.getProperty("user.dir").replace("\\", "/")
        return filePath+"/"+fileName;
    }
    /**
     * 解析获取xml节点数据
     */
    private Map<String,String> parseXml(String filePath) {
        File xmlFile = new File(filepath);
        SAXReader reader = new SAXReader();
        Map<String,String> paramMap = new HashMap<String,String>();
        try {
            Document document = reader.read(xmlFile);
            Element rootElement = document.getRootElement();

            Element nameElement = rootElement.element("name");
            String name = nameElement.getText();
            paramMap.put("name",name);

            Element telElement = rootElement.element("tel");
            String tel = telElement.getText();
            paramMap.put("tel",tel);

            Element addressElement = rootElement.element("address");
            String address = addressElement.getText();
            paramMap.put("address",address);
        } catch (Exception e) {
            logger.error("解析xml文件出错", e);
        }
        return paramMap;
    }

解析的xml文档如下

<?xml version="1.0" encoding="UTF-8"?>
<RootElement>
    <name>黑天鹅</name>
    <tel>12345678</tel>
    <address>反脆弱训练基地</address>
</RootElement>

然后我们揭晓一下SAX是如何进行xml解析的,直接上码.

    /**
     * xml文件内容解析
     *
     * @param fileName
     * @return map
     * @throws Exception
     */
    public Map<String, String> parseXmlContent(byte[] fileContent) {
        Map<String, String> dataMap = new HashMap<String, String>();
        if (fileContent.length <= 0) {
            logger.error("获取文件流出错,文件流为空");
            return null;
        }
        try {
            ByteArrayInputStream input = new ByteArrayInputStream(fileContent);
            SAXParserFactory parsefactory = SAXParserFactory.newInstance();
            SAXParser parser = parsefactory.newSAXParser();
            SAXParseHandler parseHandler = new SAXParseHandler();
            parser.parse(input, new SAXParseHandler());
            dataMap = parseHandler.getXmlMap();
        } catch (Exception e) {
            System.out.println(e);
            logger.error("xml文件解析错误", e);
            return null;
        }
        return dataMap;
    }

SAX自定义一个解析类.

class SAXParseHandler extends DefaultHandler {

    private static Map<String, String> map;

    private String tagName;

    private StringBuilder sb;

    public void startDocument() throws SAXException {
        super.startDocument();
        map = new HashMap<String, String>();
    }

    public void endDocument() throws SAXException {
        super.endDocument();
    }

    /**
     * 获取文档属性,内容,执行多次
     */
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        super.startElement(uri, localName, qName, attributes);
        //在此可以获取标签属性内容
        this.tagName = qName;
        sb = new StringBuilder();

    }

    /**
     * 获取标签值,执行多次
     */
    public void endElement(String uri, String localName, String qName) throws SAXException {
        String data = sb.toString();
        if (StringUtils.isNotBlank(tagName)) {
            switch (tagName) {
            case "name":
                map.put("name", data);
                break;
            case "tel":
                map.put("tel", data);
                break;
            case "address":
                map.put("address", data);
                break;
            default:
                break;
            }
        }
    }

    public Map<String, String> getXmlMap() {
        return map;
    }

    /**
     * 获取整个文档数据
     */
    public void characters(char[] ch, int start, int length) throws SAXException {
        sb.append(new String(ch, start, length));
    }

测试主方法(开发时候用的,按需调试即可)

    public static void main(String[] args) throws IOException {
        File file = new File("F:\\test.xml");
        FileInputStream input = new FileInputStream(file);
        ByteArrayOutputStream output = new ByteArrayOutputStream();

        byte[] bt = new byte[1024];
        int n;
        while((n = input.read(bt)) != -1){
            output.write(bt, 0, n);
        }
        input.close();
        output.close();
        byte[] filebyte = output.toByteArray();
        XmlParser par = new XmlParser();
        Map<String, String> dataMap = par.parseXmlContent(filebyte);
        System.out.println(dataMap);
    }

在解析xml的时候遇到了很多奇葩坑,用户标签不规范,发过来的数据没有标签的,还有发过来空文件的,真真够了.

尤其在解析blob字段中的xml内容数据时,也存在一些坑,到时候解决了在更新.

时间: 2024-10-01 03:54:15

XML文件解析-DOM4J方式和SAX方式的相关文章

XML文件解析之--DOM与SAX

xml文件又称‘可扩展性标记语言’,可以对文档和数据进行结构化处理,从而能够在部门.客户和供应商之间进行交换,实现动态内容生成,企业集成和应用开发. 我们在进行web开发的时候离不开xml文件,xml文件无处不在,这次就烂讨论一下xml常用的解析方法及其CRUD操作,欢迎大家交流指正. 我们先来看看两种解析方式的过程,比较一下他们的优劣之处. SAX解析方式:它对xml文档进行逐行扫描,一边扫描一边解析.当扫描到文档(document)开始与结束.元素(element)开始与结束.文档(docu

006_03Java解析XML之DOM方式与SAX方式

XML解析方式分为两种:DOM方式和SAX方式 DOM:Document Object Model,文档对象模型.这种方式是W3C推荐的处理XML的一种方式. SAX:Simple API for XML.这种方式不是官方标准,属于开源社区XML-DEV,几乎所有的XML解析器都支持它. XML解析开发包 JAXP:是SUN公司推出的解析标准实现. Dom4J:是开源组织推出的解析开发包. JDom:是开源组织推出的解析开发包. JAXP: JAXP:(Java API for XML Proc

dtd与schema的区别&amp;XML文件解析常用方式

Schema和DTD 都是用来定义各种文件中XML标记的使用规范.Schema是标准的XML文件,而DTD则使用自己的特殊语法,因此,只需要知道XML的语法规则就可以编写Schema了,不需要再学习其它语法规则.可以使用相同的处理器来解读,Schema利用命名空间将文件中特殊的节点与Schema说明相联系,一个XML文件可以有多个对应的Schema,若是DTD的话,一个XML文件只能有一个相对应的DTD文件.Schema的内容模型是开放的,可以随意扩充,而DTD则无法解读扩充的内容.DTD只能把

XML文件解析【安卓7】——SAX解析

XML文件解析 XML解析:XML技术是Android平台的应用基础,  Android提供了多种解析XML的方式:SAX解析.DOM解析.PULL解析 SAX解析 SAX --Simple  API  forXML  (XML简单的API) --解析速度快.占用内存少 --提供一组简单的API用于解析XML文件 --SAX在解析XML文件前,先指定一个解析事件处理器(Handler),SAX会对XML文档进行简单的顺序扫描,当扫描到[文档(Document)的开始和结束.元素(Element)

android之XML文件解析 -- SAX

xml文件解析之SAX 下面的实例代码主要采用的是SAX事件驱动处理机制来解析XML文件,SAX解析XML是通过逐行扫描的方式完成的,占用内存小.dom机制是将文件全部读出,然后再以树结构的形式,来完成查找.删除等操作,对内存占用较大 MyContentHandler.java     此文件是事件处理器实现 package com.example.analysisxml; import org.xml.sax.Attributes; import org.xml.sax.SAXExceptio

XML文件解析之JDOM解析

1.JDOM介绍 JDOM的官方网站是http://www.jdom.org/,JDOM解析用到的jar包可以在http://www.jdom.org/dist/binary/中下载,最新的JDOM2的版本是2.0.5,JDOM1的版本是1.1.3,根据官网中的介绍可以知道.JDOM是一个在基于内存的XML模型,它用于读写创建修改XML文档.JDOM和DOM相似因为他们都提供了内存XML文档模型,但是DOM被设计用于很多种语言(C,C++,ECMSctipr,Java,JScript,Lingo

java基础之概谈xml文件解析

XML已经成为一种很通用的数据交换格式,它的平台无关性,语言无关性,系统无关性,给数据集成与交互带来了极大的方便.诸多web应用框架,其可配置的编程方式,给我们的开发带来了很大程度的便捷,但细细想来,它们的应用无一不是java bean与xml之间的转换解析.本文将对xml的两种操作标准DOM和SAX,从它们各自的特点.适用范围等方面进行简单介绍. DOM (Document Object Model) :DOM标准中,采用W3C标准表示XML,有多重语言支持,因此其跨平台性很好.采用DOM规范

八、Android学习第七天——XML文件解析方法(转)

(转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 八.Android学习第七天——XML文件解析方法 XML文件:extensible markup language 定义:用于标记电子文件使其具有结构性的标记语言,可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言. 解析XML的方式: SAX——Simple API for XML,既是一种接口,也是一个软件包采用的是事件驱动,也就是它解析

JAVA之XML文件解析

在Java.Android开发中,xml文件的解析很重要.本人使用过的xml文件解析的方式有两种,一种是DOM文档解析.还有一种是SAX. DOM是基于文档树结构的.SAX是基于事件驱动的.SAX则是遇到标签则触发工作的.当解析器发现元素开始.元素结束.文本.文档的开始或结束等时,发送事件,程序员编写响应这些事件的代码,保存数据.优缺点很明显:DOM对于大型文件的操作不好(因为它要先读入整个文档到内存中),SAX为了解决这样问题.不用事先调入整个文档,占用资源少:SAX解析器代码比DOM解析器代