在这里我的环境我使用Java序列化结果设置为XML。 这种事基本上是这样的:
//foreach column of each row
xmlHandler.startElement(uri, lname, "column", attributes);
String chars = rs.getString(i);
xmlHandler.characters(chars.toCharArray(), 0, chars.length());
xmlHandler.endElement(uri, lname, "column");
该XML看起来像这样在Firefox:
<row num="69004">
<column num="1">10069</column>
<column num="2">sd</column>
<column num="3">FCVolume </column>
</row>
但是,当我解析XML,我得到了一个
org.xml.sax.SAXParseException:字符引用“&#26”是无效的XML字符。
我现在的问题是:我在使用哪个本地字符替换或我怎么有编码我的人物,他们将是有效的XML?
我发现了一个有趣的列表XML规范 :根据该列表中的泄气使用的字符#26(十六进制:#X1A)。
在下列范围内所定义的字符也气馁。 他们要么是控制字符或永久未定义的Unicode字符
看到完整的范围 。
此代码替换字符串中的所有非有效的XML UTF8:
public String stripNonValidXMLCharacters(String in) {
StringBuffer out = new StringBuffer(); // Used to hold the output.
char current; // Used to reference the current character.
if (in == null || ("".equals(in))) return ""; // vacancy test.
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();
}
从它拍摄无效XML字符:当有效的UTF8并不意味着有效的XML
但与我有还是UTF-8配伍问题:
org.xml.sax.SAXParseException: Invalid byte 1 of 1-byte UTF-8 sequence
看完XML -从servlet返回的XML为UTF-8我只是想,如果我设置的contentType这样会发生什么:
response.setContentType("text/xml;charset=utf-8");
和它的工作....
可扩展标记语言(XML)1.0表示:
与符号字符(&)和左尖括号(<)不能出现在它们的字面的形式,作为标记定界符时,或注释,处理指令,或CDATA段内除外。 如果在其他地方需要,他们必须使用“&”和“<”分别要么数字字符引用或字符串进行转义。 右尖括号(>)可以使用字符串来表示“>”,并且必须为相容性,在内容使用任一“>”或一个字符引用当它出现在字符串中“]]>”,当被转义串不表示一个CDATA段的结束。
如果使用CDATA可以跳过编码:
<column num="1"><![CDATA[10069]]></column>
<column num="2"><![CDATA[sd&]]></column>
哪个版本的JRE,你运行? SAX项目说:
J2SE 1.4捆绑的旧版本SAX2的。 如何使SAX2 R2或更高版本可用?