在eclipse中出现的SaxParseException错误:XML文档结构必须在同一实体内开始和结束。

8
我正在使用可以在这里找到的JAVA的last.fm API。我有一个庞大的数据集,其中我只使用了带有用户艺术家历史和播放记录的文件。我已经用Java编写了一段代码,提取这些艺术家名称并根据Artist.getSimilar()方法返回相似的艺术家。
我运行了一次,但不是所有的艺术家都进行了测试。我中途终止了调试。然而,下一次,我的结果是从缓存中返回的,请求不再发送到Web服务器。问题是,这次我只得到了直到我停止结果的艺术家为止的结果。我尝试使用另一种方式artists=Artist.getTopAlbums(),在中途停止后遇到了同样的问题。我得到的错误是:
[Fatal Error] :513:9: <strong>XML document structures must start and end within the same entity.</strong>
Exception in thread "main" de.umass.lastfm.CallException: org.xml.sax.SAXParseException; lineNumber: 513; columnNumber: 9; XML document structures must start and end within the same entity.
Caused by: org.xml.sax.SAXParseException; lineNumber: 513; columnNumber: 9; XML document structures must start and end within the same entity.
    at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:251)
    at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:300)

还有一些其他的异常,这里不是重点。

我尝试过重新安装eclipse,在-clean模式下启动eclipse和清理工作区。但都没有起作用。我也创建了一个新的工作区,但缓存仍然存在。我正在使用Eclipse 3.8。也许有效清除Eclipse缓存的方法会有所帮助?我该怎么做呢?似乎什么都不起作用。(在很多文章中建议在Window>Preferences中手动清除缓存,但是这里没有这个选项。)

或者我需要做其他的事情吗?非常感谢任何帮助。提前谢谢。

我的Java代码(完全正常运行,没有错误):

//in main
BufferedReader inp = new BufferedReader (new InputStreamReader(System.in));
String sinput=inp.readLine();
System.out.println(sinput+"\t \t \t"+getSimilarartists(sinput));


//to fetch similar artists
public static StringBuilder getSimilarartists(String artist){
String key = "af2bfbcb4dd49870fdb8e92f128f4ff7";
StringBuilder sb = new StringBuilder();
String art=(Artist.getSimilar(artist, key)).toString();
int i=0;
while(i<art.length()-5){
    if((art.substring(i, (i+4))).equalsIgnoreCase("name")){
        i=i+6;

        while(art.charAt(i)!='\''){
            sb.append(art.charAt(i));
            i++;
        }

        break;
    }
    i++;
}
return sb;
}  

输出结果(只需输出最后几行):

hans zimmer;     I recommend=Hans Zimmer & James Newton Howard<br>
nelly furtado;   I recommend=Jennifer Lopez<br>
madonna;     I recommend=Kylie Minogue<br>
blink-182;   I recommend=Box Car Racer<br>
dave gahan;  I recommend=Depeche Mode<br>
kelly clarkson;  I recommend=Carrie Underwood<br>
lucie silvas;    I recommend=Delta Goodrem<br>
natalie imbruglia;   I recommend=Melanie C<br>
michelle branch;     I recommend=The Wreckers<br>
delta goodrem;   I recommend=Ricki-Lee<br>
new order;   I recommend=Electronic<br>
seal;    I recommend=Simply Red<br>
atomic kitten;   I recommend=Liberty X 

 *** (this is where I had terminated my previous run) ***

[Fatal Error] :513:9: XML document structures must start and end within the same entity.<br>
Exception in thread "main" de.umass.lastfm.CallException: org.xml.sax.SAXParseException; lineNumber: 513; columnNumber: 9; XML document structures must start and end within the same entity.
    at de.umass.lastfm.Caller.call(Caller.java:268)<br>
    at de.umass.lastfm.Caller.call(Caller.java:189)<br>
    at de.umass.lastfm.Caller.call(Caller.java:185)<br>
    at de.umass.lastfm.Artist.getSimilar(Artist.java:144)<br>
    at de.umass.lastfm.Artist.getSimilar(Artist.java:132)<br>
    at Recommender.getSimilarartists(Recommender.java:89)<br>
    at Recommender.main(Recommender.java:58)<br>
Caused by: org.xml.sax.SAXParseException; lineNumber: 513; columnNumber: 9; XML document structures must start and end within the same entity.<br>
    at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:251)
    at     <br>
com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:300)<br>
    at de.umass.lastfm.Caller.createResultFromInputStream(Caller.java:324)<br>
    at de.umass.lastfm.Caller.call(Caller.java:256)<br>
    ... 6 more
2个回答

2

这样的错误通常表明文档格式不正确:

Caused by: org.xml.sax.SAXParseException; lineNumber: 513; columnNumber: 9; XML 文档结构必须在同一实体内开始和结束。at

以下是一些调试方法:

  1. 将 XML 文档打印到日志中并通过某种 XML 验证器运行。
  2. 检查是否存在无效字符(例如在 UTF-8 文档中使用 UTF-16 字符)。

1
我与XML文件无关。正如我所说,代码对API中列出的任何方法都可以完美运行,直到我在它仍在运行时终止它。在这种情况下,下一次它只显示到我终止它的结果。 - HackCode

0

在进行常规I/O时,Eclipse和Java都不会缓存Web内容。但是,该内容可以被缓存在其他地方。也许您正在使用的de.umass.lastfm API正在这样做。或者可能是您的操作系统或网络中有一些东西。


1
当然可以。作者推测Eclipse正在缓存Web请求,而我则认为它并没有,并指出其他需要查看的地方。答案不必提供完整的解决方案,也可以很有用。 - Konstantin Komissarchik
1
我的回答直接回应了问题中提出的问题。它并没有提供完整的解决方案,但说它没有回答问题是有些牵强附会的。 - Konstantin Komissarchik
好的,它在LQP审核队列中(我在那里遇到它),当前投票结果是4-0赞成删除。你似乎将“answer”解释为“response”的意思。我并没有说它没有解决问题所提出的问题; 我是说,“answer”并不意味着任何回答都可以解决问题。 OP正在询问为什么会发生这种情况,而这个“答案”甚至没有部分地解释为什么,它基本上只是说“Java和Eclipse不会产生这个问题,所以要寻找其他原因”。我不能把它看作是一个答案。由社区来决定... - Adi Inbar
1
根据你的答案定义,SO 上一半的答案都不符合要求。实际上,只要回答了提出的问题中的一部分,就可以算作一个答案,而我的回答也做到了这一点。被采纳的答案是最接近完整解决方案的答案,但这通常是不可能的。那么,是选择部分回答还是没有回答更好呢? - Konstantin Komissarchik
顺便说一句...我认为部分答案比没有答案要好,但是部分答案只能部分地解释为什么会发生这种情况。我真的很难理解仅仅说“Java和Eclipse不缓存,在其他地方寻找原因”就可以算作一个答案。按照这个标准,SO最终会变成那些你必须在无尽的评论、指针和讨论中筛选是否有埋藏的解决方案的技术论坛。很少见到像这样由高声望用户发布的回答而不是评论。 - Adi Inbar
显示剩余2条评论

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