XML文件解析-DOM4J方式和SAX方式

时间:2023-01-08 21:20:54

最近遇到的工作内容都是和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&period;xml文件解析

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

随机推荐

  1. ASP&period;NET将文件写到另一服务器

    有时我们需要将来自于客户端的文件上传到WEB服务器端,并在服务端将文件存储到第三方文件服务器中存储. 实现如下: 1.在文件服务器B上建立一共享文件夹,同时在该服务器上创建一用户,如DocShareU ...

  2. JAVA排序算法

    ];  ; i <  ; i++){ sort[i] = ran.nextInt(); } System.out.print(;i<sort.length;i++){ ;j<sort ...

  3. 表单和验证事件以及marquee标签

    1.表单验证<form></form> (1).非空验证(去空格) (2).对比验证(跟一个值对比) (3).范围验证(根据一个范围进行判断) (4).固定格式验证:电话号码, ...

  4. Line去年营收超5亿美元 远超竞争对手WhatsApp

    原文地址: http://news.cnblogs.com/n/206072/ 凭借着修改表情取悦国际用户的做法,日本移动消息应用 Line 在全球的用户总数已经超过 4 亿.Line.微信.What ...

  5. 焦点轮播图——myfocus焦点图库

    网站网址: http://demo.jb51.net/js/myfocus/demo.html 简单3步,你即可以用上myFocus. Step 1. 在html的标签内引入相关文件 <scri ...

  6. POJ 1472 Instant Complexity 应该叫它编程题。。

    题目:http://poj.org/problem?id=1472 这个题目是分到“模拟题”一类的,我觉得模拟的成分比较少,主要考察编程能力.独立写完这个题特别兴奋...所以我必须好好说一说,独家哦. ...

  7. 为什么Linux不需要碎片整理?

    如果你是一个 Linux 用户,你可能会听说 Linux 的文件系统不需要碎片整理.你也可能会注意到 Linux 的发行版本也都没有磁盘碎片整理的功能.这是为什么呢? 要理解为什么 Linux 的文件 ...

  8. 游戏UI框架设计&lpar;三&rpar; &colon; 窗体的层级管理

    游戏UI框架设计(三) ---窗体的层级管理 UI框架中UI窗体的"层级管理",最核心的问题是如何进行窗体的显示管理.窗体(预设)的显示我们前面定义了三种类型: 普通.隐藏其他.反 ...

  9. &lbrack;POJ 3764&rsqb; The xor-longest Path

    Description 多组数据 给你一颗树, 然后求一条最长异或路径, 异或路径长度定义为两点间简单路径上所有边权的异或和. Solution 首先 dfs 一遍,求出所有的点到根节点(随便选一个) ...

  10. apt-get update 与 apt-get upgrade 的区别

    总而言之,update是更新软件列表,upgrade是更新软件:所以,这两命令都是一块用,update后再upgrade. update 是更新 /etc/apt/sources.list 和 /et ...