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 ...
随机推荐
- 二维码及二维码接合短URL的应用
二维码 1.什么是二维码? 二维条形码,最早发明于日本,它是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的,在代码编制上巧妙地利用构成计算机内部逻辑基础的“0 ...
- vs编译程序不能实现,“未能完成操作 未指定的错误”的解决办法
1.先把.vcproj 文件剪切到其他地方 2.打开.sln,报错->点“确定”->再点“确定” 3.把 .vcproj 文件 放回来,在vs2005右边的“解决方案”处右键 重新加载,就 ...
- [翻译] flask-SocketIO
最近开发工作需要用到websocket去替代老办法轮询,因为我们的web系统使用flask搭建,所以使用flask-SocketIO作为我们的websocket方案,因此顺手翻译官方文档 *** Fl ...
- 理解java注解
@是java注解,即annotation. 注解功能可以理解为插件,是代码级别的插件,在类的方法上写:@XXX,就是在代码上插入了一个插件. Java注解是附加在代码中的一些元信息,用于一些工具在编译 ...
- centos7+cobbler安装
cobbler工作流程 1.安装软件包: yum -y install httpd dhcp tftp python-ctypes cobbler xinetd cobbler-web pykicks ...
- ubuntu安装java jdk
openjdk安装http://openjdk.java.net/install/ 一.下载 首先,当然是要下载了. 地址:http://www.oracle.com/technetwork/java ...
- loadrunder之脚本篇——定义全局变量
如果参数是全局的,在脚本中的任何一个Action中都可以使用,变量一般是局部的,如果跨Action调用会出现未声明的错误. 打开Script视图中左侧Action列表中的globals.h文件,可定义 ...
- JAVA 文件转字节数组转字符串
public static void main(String[] args) throws IOException { byte[] bytes = FileUtils.readFileToByteA ...
- 【FAQ系列】Relay log 导致复制启动失败
今天在使用冷备份文件重做从库时遇到一个报错,值得研究一下. 版本:MySQL5.6.27 一.报错现象 dba:(none)> start slave; ERROR (HY000): Slave ...
- Docker容器技术-命令进阶
一.基本命令 1.Docker布尔型选项 使用某选项但没有提供参数,等同于把选项设置为true,要改变它的值,唯一的方法是将其设置成false. 找出一个选项的默认值是true还是false: [ro ...