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. comet ajax轮询

    http://www.ibm.com/developerworks/cn/webservices/ws-tip-jaxwsrpc.html http://www.cnblogs.com/pifoo/a ...

  2. 【POJ 2486】 Apple Tree (树形DP)

    Apple Tree Description Wshxzt is a lovely girl. She likes apple very much. One day HX takes her to a ...

  3. poj crane

    #include<stdio.h> #include<math.h> #include<string.h> #include<stdlib.h> #de ...

  4. [topcoder]BinaryCards

    现在觉得有空时可以刷一下topcoder的DIV 2的Lvl 3的题目.感觉和刷LeetCode和WikiOi都是不一样的. http://community.topcoder.com/stat?c= ...

  5. 【Xamarin挖墙脚系列:最重要的布局ListView】

    原文:[Xamarin挖墙脚系列:最重要的布局ListView] 安卓的几个重要的布局 线性布局 相对布局  Table布局 Tab布局  表格Grid布局 列表布局. 这几种基本的布局的方式,最重要 ...

  6. Programming Concepts

    Attributes Attributes provide a powerful method of associating metadata, or declarative information, ...

  7. bzoj2426

    稍微列个式子就知道是贪心 ..] of longint; m,b,h0,n,i,p,j,x,ans,s:longint; procedure swap(var a,b:longint); var c: ...

  8. C#简单多线程使用(同步和优先权)

    题目: 麦当劳有两个做汉堡的厨师(工号:11,12)和三个销售人员(工号:21,22,23). 厨师生产汉堡,并负责将做好的汉堡放入货架,货架台大小有限,最多放6个汉堡,11和12不能同时往货架台上放 ...

  9. UVA_11796_Dog_Distance_(计算几何)

    描述 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&a ...

  10. [PeterDLax著泛函分析习题参考解答]第3章 Hahn-Banach 定理

    1. 证明 $(10'$). 证明: $\ra$: 由 $p_K(x)<1$ 知 $$\bex \exists\ 0<a<1,\st \cfrac{x}{a}\in K. \eex$ ...