/* ==================================================================
* Created [2009-4-27 下午11:32:55] by Jon.King
* ==================================================================
* TSS
* ==================================================================
* mailTo:jinpujun@hotmail.com
* Copyright (c) Jon.King, 2009-2012
* ==================================================================
*/
package com.jinhe.tss.core.util;
/**
* <p> XmlUtil.java </p>
* <p>
* XML相关工具类
* </p>
*/
public class XmlUtil {
/**
* 剔除XML文件中不合法的字符,像 "" 这种字符存在会导致: <br>
* org.xml.sax.SAXParseException: An invalid XML character (Unicode: 0xb) was found in the element content of the document. <br>
* 这样的异常出现,而用IE预览XML时却完全正常。<br>
*
* @param in
* @return
*/
public static String stripNonValidXMLCharacters(String in) {
if ( EasyUtils.isNullOrEmpty(in) ) return ""; // vacancy test.
StringBuffer out = new StringBuffer(); // Used to hold the output.
char current; // Used to reference the current character.
for (int i = 0; i < in.length(); i++) {
current = in.charAt(i);
if ((current == 0x9) ||(current == 0xA) || (current == 0xD) ||
((current >= 0x20) && (current <= 0xD7FF)) ||
((current >= 0xE000) && (current <= 0xFFFD)) ||
((current >= 0x10000) && (current <= 0x10FFFF)))
out.append(current);
}
return out.toString();
}
// public class StripNonValidXMLCharactersInputStream extends FilterInputStream {
//
// /**
// * 构造函数
// * @param in
// */
// public StripNonValidXMLCharactersInputStream(InputStream in) {
// super(in);
// }
//
// /**
// * <p>
// * 读取下一个字节
// * </p>
// * @return
// * @throws IOException
// * @see java.io.FilterInputStream#read()
// */
// public int read() throws IOException {
// while (true) {
// int read = in.read();
// char current = (char) read;
// if ((current == 0x9) || (current == 0xA) || (current == 0xD)
// || ((current >= 0x20) && (current <= 0xD7FF))
// || ((current >= 0xE000) && (current <= 0xFFFD))
// || ((current >= 0x10000) && (current <= 0x10FFFF))
// || (read == -1)) {
// return read;
// }
// }
// }
//
// /**
// * <p>
// * 读取特定(给定数组长度或结束)长度数据存放到给定数组中
// * </p>
// * @param b 给定字节数组
// * @return 返回读取长度
// * @throws IOException
// * @see java.io.FilterInputStream#read(byte[])
// */
// public int read(byte b[]) throws IOException {
// return read(b, 0, b.length);
// }
//
// /**
// * <p>
// * 读取指定位置开始,指定长度或结束为止的字节数据,存放到给定的数据中
// * </p>
// * @param b
// * 给定数组
// * @param off
// * 指定其实位置
// * @param len
// * 指定长度
// * @return
// * @throws IOException
// * @see java.io.FilterInputStream#read(byte[], int, int)
// */
// public int read(byte b[], int off, int len) throws IOException {
// if (b == null) {
// throw new NullPointerException();
// } else if ((off < 0) || (off > b.length) || (len < 0)
// || ((off + len) > b.length) || ((off + len) < 0)) {
// throw new IndexOutOfBoundsException();
// } else if (len == 0) {
// return 0;
// }
//
// int c = read();
// if (c == -1) {
// return -1;
// }
// b[off] = (byte) c;
//
// int i = 1;
// try {
// for (; i < len; i++) {
// c = read();
// if (c == -1) {
// break;
// }
// if (b != null) {
// b[off + i] = (byte) c;
// }
// }
// } catch (IOException ee) {
// }
// return i;
// }
//
// public static void main(String[] args) throws DocumentException, IOException {
// FileInputStream is = new FileInputStream(URLUtil.getResourceFileUrl("appServers.xml").getPath());
// StripNonValidXMLCharactersInputStream xis = new StripNonValidXMLCharactersInputStream(is);
//
// int bytesRead = 0;
// OutputStream out = new ByteArrayOutputStream();
// final int length = 8192;
// byte[] buffer = new byte[length];
// while ((bytesRead = xis.read(buffer, 0, length)) != -1) {
// out.write(buffer, 0, bytesRead);
// out.flush();
// }
// System.out.print(out.toString());
// }
// }
/**
* 将一个对象转换成xml支持的格式,包括特殊字符、null显示成""以及数字等于0时显示成""
*
* @param obj
* @return
*/
public static String toFormXml(Object obj) {
if (obj == null) {
return "";
}
String message = obj.toString();
char content[] = new char[message.length()];
message.getChars(0, message.length(), content, 0);
StringBuffer result = new StringBuffer(content.length + 50);
for (int i = 0; i < content.length; i++) {
switch (content[i]) {
case '<':
result.append("<");
break;
case '>':
result.append(">");
break;
case '&':
result.append("&");
break;
case '"':
result.append(""");
break;
default:
result.append(content[i]);
}
}
return (result.toString());
}
/**
* 替换XML数据属性值中的特殊字符,包括<、>、"、&等
*
* @param string
* @return
*/
public static String replaceXMLPropertyValue(String xmlStr) {
return xmlStr.replaceAll("&", "&")
.replaceAll("\"", """)
.replaceAll("<", "<")
.replaceAll(">", ">");
}
}