1

我正在尝试解析下一个网址: http://kavim-t.co.il/include/getXMLStations.asp?parent= 55_%20_2

代码:

//using jdom SAX parser
SAXBuilder builder = new SAXBuilder();
URL url = new URL("http://kavim-t.co.il/include/getXMLStations.asp?parent=55_%20_2");
InputStream in = getInputStrem(url);
Document document = builder.build(in); ...

获取输入流():

public static InputStream getInputStrem(URL url) {
    InputStream in = null;
    try {
        HttpURLConnection con = (HttpURLConnection) url.openConnection();
        con.setRequestMethod("GET");
        con.connect();
        in = con.getInputStream();

    } catch (IOException e) {
        e.printStackTrace();
    }
    return in;
}

异常“第 3 行错误:第 3 行第 29 列:格式不正确(无效令牌)”

尝试运行下一行时得到:

Document document = builder.build(in)  

我认为问题出在 getInputStream() 函数中,

因为如果我将 Url 替换为更简单的(没有参数和经典结构),它工作正常。

4

3 回答 3

1

这可能是一个字符编码问题。您得到的错误可能是因为 InputStream 被解释为与实际数据不同的字符集。

URL 有一个输入流,但也有一个字符集。当您将流提供给 JDOM 时,您将忽略该字符集。

您应该尝试的第一件事是删除所有 getInputStream 代码。JDOM 有一个直接的 SAXBuilder.build(URL) 方法,该方法将同时考虑流和字符集......

你的整个代码可以这样简化。事实上,如果你给 JDOM 一个字符串参数,它会将它解释为一个 URL (SystemID),所以你的代码可以很简单:

SAXBuilder builder = new SAXBuilder();
Document document = builder.build("http://kavim-t.co.il/include/getXMLStations.asp?parent=55_%20_2");

编辑: - -

好吧,我在我的环境中运行了“我的”版本的代码,并且(使用 Xerces 作为解析器)我得到了关于这个问题的更多细节......:

Caused by: org.apache.xerces.impl.io.MalformedByteSequenceException: Invalid byte 2 of 3-byte UTF-8 sequence.
    at org.apache.xerces.impl.io.UTF8Reader.invalidByte(Unknown Source)
    at org.apache.xerces.impl.io.UTF8Reader.read(Unknown Source)
    at org.apache.xerces.impl.XMLEntityScanner.load(Unknown Source)
    at org.apache.xerces.impl.XMLEntityScanner.scanContent(Unknown Source)
    at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanContent(Unknown Source)
    ... 11 more

因此,您的输入数据似乎未正确编码....

再次编辑:

这是输入文档上 xmllint 的输出。xmllint 是一个可用于大多数 Linux 发行版的 unix 程序。它提供了一种很好的“客观”方式来验证您的 XML。

david.xml:3: parser error : Input is not proper UTF-8, indicate encoding !
Bytes: 0xEE 0xF1 0xE5 0xF3
<option value="22958">22958: îñåó øéãéðâ</option><option value="22920">22920: ãé
                             ^

实际上,您有一个损坏的 XML 文档。如果您坚持,您可以向 JDOM 的 SAXBuilder 添加一个忽略错误的错误处理程序。请参阅此处的 JDOM 文档:http: //www.jdom.org/docs/apidocs/org/jdom2/input/SAXBuilder.html#setErrorHandler%28org.xml.sax.ErrorHandler%29在其中可以添加忽略的 ErrorHandler问题。(覆盖错误方法,并返回而不是抛出异常).....然后不会报告问题,解析器将“继续”,但是您在解析结果中丢失数据....

于 2012-05-14T09:42:32.297 回答
1

从文件中读取相同的问题,我解决了这个问题:

File file = new File("/somewhere/somefile.xml"); 
FileInputStream stream = new FileInputStream(file), "UTF-8");
Reader reader = new BufferedReader(new InputStreamReader(stream));

SAXBuilder builder = new SAXBuilder();           
Document doc = builder.build(reader);

在您的情况下,您可能会从 URL 获取流,例如:

InputStream stream = new URL("http://www.somewhere.com/somefile.xml").openStream();
Reader reader = new BufferedReader(new InputStreamReader(stream));

SAXBuilder builder = new SAXBuilder();           
Document doc = builder.build(reader);

作为最后一个资源(因为编码不能在 Url::openStream() 上强制执行),我将在本地保存数据,然后像我的第一个示例中那样使用文件流打开它。

于 2012-12-03T13:04:58.463 回答
0

来自 HTTP 请求的 XML 响应文本格式不正确。尝试先验证它。因此,是个例外。

于 2012-05-14T05:38:44.243 回答