遇到无效字符“&#x0”

10

我在解析XML时遇到以下异常。

Fatal error at line -1  Invalid character '&#x0' encountered. No stack trace

我有一个字符串格式的XML数据,并使用DOM解析器进行解析。 我正在解析来自Java服务器发送到Blackberry客户端的响应数据。 我也尝试使用SAX解析器解析,但问题没有解决。 请帮忙。


<START><TAG1>值</TAG1><TAG2>值</TAG2><TAG3>值</TAG3><TAG4>值</TAG4></START>XML以字符串格式呈现 - iOSDev
4个回答

16

您的字符流中有一个null字符,即char(0),它在XML文档中无效。如果原始字符串中不存在此字符,则很可能是字符解码问题。


6

我找到了解决方案,

我只是用trim()对其进行了修整, 并且它完美地运行了。


2
是的,也许这是因为“null”字符在您的字符串末尾。但我认为真正的解决方案应该是使用替换字符“\0”,并将其更改为空字符串。 - Dario Quintana

4

您的代码当前使用平台默认编码调用getBytes() - 这很少是一个好主意。找出数据的真正编码,并使用它(很可能是UTF-8)。

如果Blackberry包括DocumentBuilder.parse(InputSource),那就更好了:

DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance(); 
DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();
StringReader reader = new StringReader(xmlData);
try {
    Document doc = docBuilder.parse(xml); 
    doc.getDocumentElement().normalize();
} finally {
    reader.close();
}

如果这样做不起作用,请非常仔细地查看您的字符串,例如像这样:

for (int i=0; i < xmlData.length(); i++) {
    // Use whatever logging you have on the Blackberry
    System.out.println((int) xmlData.charAt(i));
}

可能问题出在读取服务器响应时,如果读取不当,您的字符串中可能会有Unicode空字符(\u0000),这些字符可能不会在日志/调试输出中明显显示,但会导致您所展示的错误。
编辑:我刚刚看到您首先获取了base64数据 - 那么为什么要将其转换为字符串,然后再转回字节?只需将base64解码为字节数组,然后使用该数组作为ByteArrayInputStream的基础即可。这样,您就永远不必处理文本编码。

另外,我如何检查字符串中是否有\u0000? 我对处理XML很新,请问有什么方法可以检查吗? 请帮忙。 - iOSDev
2
看第二个代码片段 - 它展示了如何手动检查字符串。你可以使用 xmlData.indexOf("\u0000") 进行程序化检查。 - Jon Skeet
哪种解决方案?你有检查过字符串吗?如果您在问题中提供更多详细信息,那会很有帮助。 - Jon Skeet
你好Jon,我使用了StringReader尝试上面的代码片段。 我还测试了一下没有将xmlData从byte[]转换为string的情况。 但是我仍然得到了相同的错误。 - iOSDev
2
听起来你的数据有问题。如果你能发布你能生成的最小响应的base64,那会帮很大忙。 - Jon Skeet

0
InputStream xml = new ByteArrayInputStream(xmlData.getBytes());
DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();
Document doc = docBuilder.parse(xml);
doc.getDocumentElement().normalize();
xml.close();

以下是我用来解析的代码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接