博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
XML文件解析-DOM4J方式和SAX方式
阅读量:5889 次
发布时间:2019-06-19

本文共 4737 字,大约阅读时间需要 15 分钟。

最近遇到的工作内容都是和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
parseXml(String filePath) { File xmlFile = new File(filepath); SAXReader reader = new SAXReader(); Map
paramMap = new HashMap
(); 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文档如下

黑天鹅
12345678
反脆弱训练基地

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

/**     * xml文件内容解析     *      * @param fileName     * @return map     * @throws Exception     */    public Map
parseXmlContent(byte[] fileContent) { Map
dataMap = new HashMap
(); 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
map; private String tagName; private StringBuilder sb; public void startDocument() throws SAXException { super.startDocument(); map = new HashMap
(); } 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
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
dataMap = par.parseXmlContent(filebyte); System.out.println(dataMap); }

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

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

转载于:https://www.cnblogs.com/fxust/p/7498044.html

你可能感兴趣的文章
android The project target (Android 2.3.3) was not properly loaded
查看>>
【转】EDK简单使用流程(3)
查看>>
loj#2538. 「PKUWC2018」Slay the Spire
查看>>
这是一篇被河蟹了的博客
查看>>
一个两年Java的面试总结
查看>>
软件工程项目组Z.XML会议记录 2013/11/27
查看>>
科学计算库学习报告
查看>>
软件测试 -- 软件测试的风险主要体现在哪里
查看>>
Ubuntu中无法update的解决办法
查看>>
仿射变换
查看>>
decltype类型指示符
查看>>
虹软ArcFace人脸识别 与 Dlib 人脸识别对比
查看>>
laravel 验证码使用示例
查看>>
IE开发人员工具无法使用
查看>>
分页器(自定制)
查看>>
crossplatform---Nodejs in Visual Studio Code 05.Swig+Bootstrap
查看>>
HDU1877 又一版 A+B
查看>>
往sde中导入要素类报错000732
查看>>
springboot之启动方式
查看>>
初次安装git配置用户名和邮箱及密钥
查看>>