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内容数据时,也存在一些坑,到时候解决了在更新.
XML文件解析-DOM4J方式和SAX方式的更多相关文章
- XML的解析(DOM以及SAX方式)
感谢http://blog.csdn.net/redarmy_chen/article/details/12951649(关于SAX解析)以及http://blog.csdn.net/zhangerq ...
- XML文件解析之--DOM与SAX
xml文件又称‘可扩展性标记语言’,可以对文档和数据进行结构化处理,从而能够在部门.客户和供应商之间进行交换,实现动态内容生成,企业集成和应用开发. 我们在进行web开发的时候离不开xml文件,xml ...
- Dom4j解析Xml文件,Dom4j创建Xml文件
Dom4j解析Xml文件,Dom4j创建Xml文件 >>>>>>>>>>>>>>>>>>&g ...
- 八、Android学习第七天——XML文件解析方法(转)
(转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 八.Android学习第七天——XML文件解析方法 XML文件:exten ...
- Python实现XML文件解析
1. XML简介 XML(eXtensible Markup Language)指可扩展标记语言,被设计用来传输和存储数据,已经日趋成为当前许多新生技术的核心,在不同的领域都有着不同的应用.它是web ...
- java基础之概谈xml文件解析
XML已经成为一种非常通用的数据交换格式,它的平台无关性,语言无关性,系统无关性,给数据集成与交互带来了极大的方便. 诸多web应用框架,其可配置的编程方式,给我们的开发带来了非常大程度的便捷,但细细 ...
- XML文件解析之JDOM解析
1.JDOM介绍 JDOM的官方网站是http://www.jdom.org/,JDOM解析用到的jar包可以在http://www.jdom.org/dist/binary/中下载,最新的JDOM2 ...
- 通过正则表达式实现简单xml文件解析
这是我通过正则表达式实现的xml文件解析工具,有些XHTML文件中包含特殊符号,暂时还无法正常使用. 设计思路:常见的xml文件都是单根树结构,工具的目的是通过递归的方式将整个文档树装载进一个Node ...
- android基础知识13:AndroidManifest.xml文件解析
注:本文转载于:http://blog.csdn.net/xianming01/article/details/7526987 AndroidManifest.xml文件解析. 1.重要性 Andro ...
随机推荐
- CAS单点登录------302个没完没了
我的配置如上 背景:Shiro + Cas 进行的单点登录配置! 其实这个问题很扯淡!看代码! 我本在shiro里面配置的Sucessurl !嘿嘿!我哭了!屌用没有! 我一脸懵逼大写的WHY??? ...
- Null和Undefined类型
Null和Undefined类型都只有唯一的特殊值,即null和undefined.不过null是关键字而undefined不是. JavaScript把两者定义为相等的,如下代码可以验证: aler ...
- 【题解】BZOJ3489 A Hard RMQ problem(主席树套主席树)
[题解]A simple RMQ problem 占坑,免得咕咕咕了,争取在2h内写出代码 upd:由于博主太菜而且硬是要用指针写两个主席树,所以延后2hQAQ upd:由于博主太菜而且太懒所以他决定 ...
- Android系统移植与调试之------->如何修改Android手机NFC模块,使黑屏时候能够使用NFC
我们都知道在不修改源代码的情况下,只能是解锁之后才能使用NFC功能.而在锁屏和黑屏2个状态下是没办法用NFC的,但是最近有个客户要求手机在黑屏状态下能够使用NFC,因此我们需要去修改Android源代 ...
- 理解spring中的BeanFactory和FactoryBean的区别与联系
原文地址:http://blog.csdn.net/joenqc/article/details/66479154 首先,这俩都是个接口… 实现 BeanFactory 接口的类表明此类事一个工厂,作 ...
- 1.4 使用电脑测试MC20的接收英文短信功能
需要准备的硬件 MC20开发板 1个 https://item.taobao.com/item.htm?id=562661881042 GSM/GPRS天线 1根 https://item.taoba ...
- Objective-C 继承和多态
学习Java我们知道类有三大特征,封装,继承,多态.而在Objective-C中也有继承的概念,今天就来看看Objective-C中的继承和多态. 首先,我们来看看示例代码: //Animal.h # ...
- input date 对 placeholder 的支持问题
正常情况下,text 的 input 会显示 placeholder 中的值,date 类型的 input 对其支持不好.实例代码如下: <input type="text" ...
- hadoop本地运行与集群运行
开发环境: windows10+伪分布式(虚拟机组成的集群)+IDEA(不需要装插件) 介绍: 本地开发,本地debug,不需要启动集群,不需要在集群启动hdfs yarn 需要准备什么: 1/配置w ...
- 实用篇如何使用github(本地、远程)满足基本需求
一.结构: |--工作区 |--版本库 |--stage——add,可以每个添加到暂存区 |--master——commit 一次性提交到版本库 ...