xml中的敏感字符是尖括号,如果xml的值中含有尖括号,那么在解析的时候就会报错,如:

<?xml version="1.0" encoding="UTF-8"?><books><book><id>1</id><name><三国<><演><演>义</name><price>4<>5</price><author>罗贯中</author></book></books>

需要先对这些xml文件进行处理。

我的一个大概思路是这样的:

先利用正则找出所有的标签,再把标签存入一个ArrayList中,然后对照arraylist中的值,把标签两端的尖括号换成标记的字符串,然后转义掉剩余的所有尖括号,最后再把标记字符串转换成尖括号即可。

代码如下:

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern; public class FilterXMLUtil {
/**
* 传入一个xml字符串,将其中的多余的<>转义后返回
* @param xmlStr
* @return
*/
public static String filterIllegalityChar(String xmlStr) {
//用来存放标签的集合
List<String> tags = new ArrayList<String>();
//去掉最前面的两个尖括号
xmlStr = xmlStr.replace("<?xml", "?xml").replace("\"UTF-8\"?>", "\"UTF-8\"?");
//通过正则找到所有的标签
Pattern tag = Pattern.compile("<([a-zA-Z0-9]+)>");
Matcher mc = tag.matcher(xmlStr);
while(mc.find()){
//匹配成功之后将之存入list中
tags.add(mc.group(1));
}
/**
* 临时替代符号
* <-----------> ^^
* >----------->~~
* </---------->##/
*/
for(int i = 0;i<tags.size();i++){
xmlStr = xmlStr.replaceAll("<" + tags.get(i) + ">",
"^^"+tags.get(i)+"~~").replaceAll("</"+tags.get(i)+">", "##/"+tags.get(i)+"~~");
}
//转义
xmlStr = xmlStr.replaceAll("<", "&lt;").replace(">", "&gt;");
//转换回来
xmlStr = xmlStr.replace("^^", "<").replace("~~", ">").replace("##/", "</").replace("?xml", "<?xml").replace("\"UTF-8\"?", "\"UTF-8\"?>");
return xmlStr;
}
}

输出:

<?xml version="1.0" encoding="UTF-8"?><books><book><id>1</id><name>&lt;三国&lt;&gt;&lt;演&gt;&lt;演&gt;义</name><price>4&lt;&gt;5</price><author>罗贯中</author></book></books>

这样就可以解析这个xml字符串了。

版权声明:本文为博主原创文章,未经博主允许不得转载。

java转义xml中的多余尖括号的更多相关文章

  1. C语言中头文件尖括号和引号的区别

    用include 引用头文件时,双引号和尖括号的区别: 1.双引号:引用非标准库的头文件,编译器首先在程序源文件所在目录查找,如果未找到,则去系统默认目录查找,通常用于引用用户自定义的头文件. 2.尖 ...

  2. JAVA 转义字符串中的特殊字符

    package test; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Test { pu ...

  3. JAVA web.xml中引用多个XML

    web.xml里加<context-param><param-name>contextConfigLocation</param-name><param-va ...

  4. grep中正则表达式使用尖括号表示一个单词

    比如 grep '\<bin\>' /etc/passwd --color

  5. mybatis xml 中 trim 多余的符号

    <if test="(mac != null and mac != '') or (roomNo != null and roomNo != '') or (bedNo != null ...

  6. 用MathType编辑上下尖括号有什么技巧

    在MathType中,同一个数学符号可以进行各种变换方向的使用,就比如箭头符号,任意方向都可以使用,这也是很常见的.数学中的符号能够根据各种特殊需要进行灵活使用,除了箭头符号之外,其它符号也可以,比如 ...

  7. XML中的值得注意的"坑"

    XML严禁 & < ,建议 < > & ' "进行转义 XML中预定义了5个实体引用: < > & ' " 其中,'<' ...

  8. include包含头文件的语句中,双引号和尖括号的区别是什么?

    include包含头文件的语句中,双引号和尖括号的区别是什么?  #include <> 格式:引用标准库头文件,编译器从标准库目录开始搜索 尖括号表示只在系统默认目录或者括号内的路径查找 ...

  9. C++中尖括号和引号的区别---转载

    如果你还看一些别的C++教程,那么你可能很早就发现了,有些书上的#include命令写作#include <文件名>,但有时候又会出现#include "文件名".你会 ...

随机推荐

  1. OA学习笔记-010-Struts部分源码分析、Intercepter、ModelDriver、OGNL、EL

    一.分析 二. 1.OGNL 在访问action前,要经过各种intercepter,其中ParameterFilterInterceptor会把各咱参数放到ValueStack里,从而使OGNL可以 ...

  2. ANDROID_MARS学习笔记_S04_009_用java.lang.ref.SoftReference作缓存,android.os.Handler和new Thread异步加载略图片

    一.简介 二.代码流程 1.private Map<String, SoftReference<Drawable>> imageCache = new HashMap<S ...

  3. Android软件开发之发送短信与系统短信库解析

    今天我和同学们讨论一下Android平台下如何调用系统方法发送短信.接收短信.系统的短信库相关的问题.进入正题,我们先使用Eclipse工具模拟给自己的模拟器发送一条短信.在Eclipse下打开DDM ...

  4. Learning WCF Chapter1 Summary

    SummaryThis chapter covered a lot of ground,beginning with a look at the purpose of WCF,the problems ...

  5. unicode下各种类型转换CString、string

    把最近用到的各种unicode下类型转换总结了一下: 1.string转CString string a=”abc”; CString str=CString(a.c_str()); 或str.for ...

  6. bzoj2257

    不难发现其实这个捣鼓过程就是一个辗转相减所以最小燃料是瓶容量的最小公约数然后穷举约数即可 ..] of longint; n,k,x,i,m,j,t:longint; procedure sort(l ...

  7. Android模拟器——Genymotion

    还在用Android原生模拟器?向你推荐一款全方位把Android原生模拟器秒成渣渣的神器:Genymotion! 需要理由? 性能卓越作为历史上最快的Android模拟器(没有之一),秒级开机关机速 ...

  8. HDU 5968 异或密码 【模拟】 2016年中国大学生程序设计竞赛(合肥)

    异或密码 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Problem Des ...

  9. input hidden用法

    之前获取数据传数据,都是写在全局变量里,今天老板告诉我说用input hidden来存,我百度了一下,确实是个好方法,记录之: 1 隐藏域在页面中对于用户是不可见的,在表单中插入隐藏域的目的在于收集或 ...

  10. 执行一条cmd命令的window.bat 批处理代码:

    . .执行一条cmd命令的window.bat 批处理代码: @echo off echo NodeJS SUPERVISOR...Server.js ::下面是批处理代码 supervisor d: ...