自从几个月以来,每天晚上我的服务都是从外部webservice加载xml文件。我的服务解析xml数据并将它们存储在数据库中。
DocumentBuilder dBuilder = factory.newDocumentBuilder();
Document doc = dBuilder.parse(inputStream);
[...]
今晚该服务报告错误:
MalformedByteSequenceException:1字节UTF-8序列的无效字节1
正如您所看到的,xml节点location
在name
标记内包含一些损坏的字符串:
<location>
<name>Park Inn by Radisson Dldorf-Sname>
<country>Deutschland</country>
<region></region>
<city>Düsseldorf</city>
<zip>40599</zip>
<street>Am Schönenkamp 9</street>
</location>
[...]
<location>
<name>BEST WESTERN Hotel City Centre Brl</name>
<country>Belgien</country>
<region></region>
<city>Brüssel</city>
<zip>1210</zip>
<street>Square Victoria Regina 9</street>
</location>
像oder street这样的其他标签已经很好地形成了utf-8字符串。
我无法控制xml webservice 。所以我必须在我的服务中做这个热修复。
我的想法是写一个转换器,但它不会工作:
// convert the value of <name>?</name> to an utf8 string
private static String convertToUTF8(String brokenNonUtf8String) throws Exception{
ByteBuffer bb = ByteBuffer.wrap(brokenNonUtf8String.getBytes()); // "UTF-8"
CharBuffer cb = Charset.forName("windows-1252").decode(bb);
bb = Charset.forName("UTF-8").encode(cb);
return new String(bb.array());
}
输入现在是:
<name>Park Inn by Radisson D�sseldorf-S�d</name>
我知道如何解决这个问题。