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 ...
随机推荐
- Java格式化日期的三种方式
1)借助DateFormat类: public String toString(Date d) { SimpleDateFormat sdf = new SimpleDateFormat(“yyyy- ...
- 转 谈谈JS里的{ }大括号和[ ]中括号的用法,理解后就可以看懂JSON结构了。
一.{ } 大括号,表示定义一个对象,大部分情况下要有成对的属性和值,或是函数. 如:var LangShen = {"Name":"Langshen",&qu ...
- CAS 源码编译
准备 :gradle idea 第一次用Idea 还是有点不熟悉呀,还是eclipse 顺手! 哈哈 下载源码 :我的是4.2.7 解压 导入idea 重点: 调试时候在写 .没时间
- Introduction to Mathematical Thinking - Week 9
错题 评分出错 题目要求的是 "any" ,而答案只给出了一个.所以认为回答者没有理解题意,连 any 都没有理解.所以 0 分. 第一,标准的归纳法只能对自然数使用,而题目要求的 ...
- HTML 之 Table 表格详解
HTML 之 Table 表格详解 HTML中的table可以大致分为三个部分: thead ---------表格的页眉 tbody ---------表格的主体 tfoot ---------定义 ...
- centos安装lumen
刚开始安装报错,我用的是php7,先安装zip,uzip扩展 yum install zip unzip php7.0-zip 然后通过 Composer 的 create-project 命令来安装 ...
- 4.5 基于STM32+MC20远程短信控制开关
需要准备的硬件 MC20开发板 1个 https://item.taobao.com/item.htm?id=562661881042 GSM/GPRS天线 1根 https://item.taoba ...
- Git处理 行结束符
Dealing with line endings (Windows) 如果你正在使用Git在GitHub上和别人协作的话,确保Git处理行结束符的配置已经正确配置了. 每次在键盘上按下return键 ...
- [不常用] - CSRF(跨站点请求伪造)
CSRF,Cross Site Request Forgery,即跨站点请求伪造. 这种攻击是指,在用户正常登录系统以后,攻击者诱使用户访问一些非法链接,以执行一些非法操作. 比如:如果删除用户操 ...
- 解决远程桌面关闭后teamviewer不能连接的问题
使用windows远程桌面连接远程电脑,在关闭远程桌面后,windows系统会锁定,此时再用teamviewer连接会出现“无法捕捉画面”或者“拒绝连接”的问题. 解决办法:设置要连接的远程电脑上的t ...