最近遇到的工作内容都是和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内容数据时,也存在一些坑,到时候解决了在更新.

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

  1. XML的解析(DOM以及SAX方式)

    感谢http://blog.csdn.net/redarmy_chen/article/details/12951649(关于SAX解析)以及http://blog.csdn.net/zhangerq ...

  2. XML文件解析之--DOM与SAX

    xml文件又称‘可扩展性标记语言’,可以对文档和数据进行结构化处理,从而能够在部门.客户和供应商之间进行交换,实现动态内容生成,企业集成和应用开发. 我们在进行web开发的时候离不开xml文件,xml ...

  3. Dom4j解析Xml文件,Dom4j创建Xml文件

    Dom4j解析Xml文件,Dom4j创建Xml文件 >>>>>>>>>>>>>>>>>>&g ...

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

    (转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 八.Android学习第七天——XML文件解析方法 XML文件:exten ...

  5. Python实现XML文件解析

    1. XML简介 XML(eXtensible Markup Language)指可扩展标记语言,被设计用来传输和存储数据,已经日趋成为当前许多新生技术的核心,在不同的领域都有着不同的应用.它是web ...

  6. java基础之概谈xml文件解析

    XML已经成为一种非常通用的数据交换格式,它的平台无关性,语言无关性,系统无关性,给数据集成与交互带来了极大的方便. 诸多web应用框架,其可配置的编程方式,给我们的开发带来了非常大程度的便捷,但细细 ...

  7. XML文件解析之JDOM解析

    1.JDOM介绍 JDOM的官方网站是http://www.jdom.org/,JDOM解析用到的jar包可以在http://www.jdom.org/dist/binary/中下载,最新的JDOM2 ...

  8. 通过正则表达式实现简单xml文件解析

    这是我通过正则表达式实现的xml文件解析工具,有些XHTML文件中包含特殊符号,暂时还无法正常使用. 设计思路:常见的xml文件都是单根树结构,工具的目的是通过递归的方式将整个文档树装载进一个Node ...

  9. android基础知识13:AndroidManifest.xml文件解析

    注:本文转载于:http://blog.csdn.net/xianming01/article/details/7526987 AndroidManifest.xml文件解析. 1.重要性 Andro ...

随机推荐

  1. Java中,由this关键字引发的问题

    很久之前一直有一个疑问,最近重新翻了遍JVM的书,才算是终于有所顿悟.问题如下: 被自己遗忘的问题 package org.hanyan.test.testClass; public class T3 ...

  2. kafka 集群安装过程

    1.下载需要的安装包 http://kafka.apache.org/downloads.html 本文使用的 Scala 2.9.2 - kafka_2.9.2-0.8.2.2.tgz (asc,  ...

  3. element-UI的操作步骤steps每一项添加事件,比如click,hover

    简单来说,只添加click 和css :hover就好了 一.组件里 <el-steps :space="200" :active="1" finish- ...

  4. HNOI2014

    本蒟蒻到现在才把$HNOI2014$的坑填完... $AFO$之后码力急速下降... 感觉都没有码力了... 附上题解: $DAY1$: $T1$: BZOJ3571: [Hnoi2014]画框 $T ...

  5. Latex技巧:在图表序号中加入章节号(实现诸如“图1.1.2”这样的图表序号)

    平时看书经常看到"图1.2"这样的编号,含义是第1章的第2幅插图:或者"图1.1.2",含义是第1章第1节的第2幅插图.而在LaTeX中如果直接插图的话只会显示 ...

  6. 找出n的阶乘末尾有几个零

    原理:因为10由2*5组成,而构成2的因数比5多 所以最终转换成求5的个数 int getNumber(int n) { int count = 0; while(n) { n = n/5; coun ...

  7. PhoneGap 兼容IOS上移20px(包括启动页,拍照)

    引自:http://stackoverflow.com/questions/19209781/ios-7-status-bar-with-phonegap 情景:在ios7下PhoneGap app会 ...

  8. 标准c时间与日期函数

    标准c时间与日期函数 asctime 语法:     #include <time.h>   char *asctime( const struct tm *ptr ); 功能: 函数将p ...

  9. Service Fusing

    服务熔断也称服务隔离,来自于Michael Nygard 的<Release It>中的CircuitBreaker应用模式,Martin Fowler在博文CircuitBreaker中 ...

  10. SOA 面向服务架构 阅读笔记(四)

    15  SOA管理 15.1 管理指的是实现一个制约和平衡的一致过程,以确保得到期望的结果. 15.2 管理被广泛应用于人工流程和软件流程中,一旦管理失败,后果会非常严重. 15.3 SOA管理的首要 ...