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("<", "<").replace(">", ">");
//轉換回來
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><三國<><演><演>義</name><price>4<>5</price><author>羅貫中</author></book></books>
這樣就可以解析這個xml字符串了。
版權聲明:本文為博主原創文章,未經博主允許不得轉載。
