javax.xml.bind.UnmarshalException

使用JAXB解析XML时报了下面一个错误

javax.xml.bind.UnmarshalException
 - with linked exception:
[org.xml.sax.SAXParseException: An invalid XML character (Unicode: 0x0) was found in the element content of the document.]

从描述来看异常是由于在XML文档中有非法字符(0x0),就是null。把文档拿出来看看

<response>
    <message>
       <![CDATA[...20%30%...70%new progress7090%new progress90..100%0<name>backup_2014-01-21_7-35-49.tgz</name>]]>
    </message>
    <errorcode>0</errorcode>
    <status>SUCCESS</status>
</response>

很简单的文档,看不出问题。

产生异常的代码如下:

ByteArrayInputStream input = new ByteArrayInputStream(msg.getBytes());
JAXBContext jc = JAXBContext.newInstance(Response.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();

Response resp = (Response) unmarshaller.unmarshal(input);
在执行红色代码时抛出异常。

Google了一把,发现问题所在

msg是String类型,这个字符串是从HTTP connection中读出来的,

InputStream content = (InputStream) conn.getContent();
InputStreamReader rdr1 = new InputStreamReader(content);
char[] cbuf = new char[MAXCHARPERLINE];
int num = rdr1.read(cbuf);
String msg = new String(cbuf, 0, num);
但是输入流的编码格式与系统默认的编码格式并不一致,比如输入流是ISO-8859-1,但是系统默认的是utf-8,这样在解码时就有可能产生XML非法字符,导致解析异常。

将上面的代码改为从HTTP头中取编码格式,然后使用正确的格式来读取输入流,问题解决

String type = conn.getContentType();
int index = type.indexOf("charset=");
String charset = type.substring(index + "charset=".length());
InputStream content = (InputStream) conn.getContent();
InputStreamReader rdr1 = new InputStreamReader(content, charset);



  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值