【问题标题】:XML parser not parsing UTF-8 despite correct encoding尽管编码正确,XML 解析器仍无法解析 UTF-8
【发布时间】:2017-03-25 02:58:12
【问题描述】:

注意:这里有无数关于这个一般主题的问题,但我找不到针对我的具体问题的任何内容。

我正在从 http://rss.cnn.com/rss/cnn_latest.rss 解析 XML,我的解析器工作得很好,我得到了我正在寻找的一切。没问题。然后出乎意料地,经过数小时的正常工作……我开始遇到一些编码错误。

现在,我一直在做的是将源 XML 写入文件,然后解析该文件,如下所示。

File xmlfile = new File("cnnxml.txt");
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();

DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(xmlfile);

奇怪的是这是 XML 文件的第一行,所以看起来编码实际上是 UTF-8

<?xml version="1.0" encoding="UTF-8"?>

以下是我在 Eclipse 中遇到的错误。

com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException:Invalid byte 3 of 4-byte UTF-8 sequence.
at com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.invalidByte(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.read(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.load(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.scanData(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanCDATASection(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source) at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(Unknown Source)
at javax.xml.parsers.DocumentBuilder.parse(Unknown Source)
at getRSS.main(getRSS.java:87)

而且,这又是一整天的工作,然后我突然开始遇到问题。怎么回事?

【问题讨论】:

  • 我有一个 IOException try-catch ,它仍然会产生这个问题。当您说序列在一个实体中时,您是指在 XML 的每个单独项目(在这种情况下,每个故事链接到 RSS)中吗?这将为我的理论提供一些可信度,即无论出于何种原因,在我的编码过程中,一些奇怪的东西被添加到网站上,并破坏了曾经工作的东西。
  • @JoopEggen 你的评论应该是一个答案。

标签: java xml eclipse parsing xml-parsing


【解决方案1】:

获取文件的 InputStream,使用指定的字符编码(UTF-8)将其转换为字符串,并从字符串中解析 InputSource。 示例代码:

        DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
        String content = IOUtils.toString(xmlInputStream, "UTF-8");
        InputSource is = new InputSource(new StringReader(content));
        Document doc = dBuilder.parse(is);
        doc.getDocumentElement().normalize();

【讨论】:

    【解决方案2】:

    您必须探索的解决方案。但@MichaelKay 认为不太可能有更好的答案。

    文件声明为 UTF-8 但不是。使用 JEdit 或 Notepad++ 等程序员的编辑器来玩转编码。由于这是一个数据错误,捕获异常并制作文件副本以供检查。它可能只是服务器的错误消息 - 然后解决方案是检查响应状态。注意:可能序列在实体中 - 请参阅堆栈跟踪。

    我的猜测是某些 XML 已损坏,因此 try-catch 应该对数据做一些事情:将其与堆栈跟踪等一起存储。最好是可重复的。

    数据可能与“乱序”消息或某些边界情况有关。

    【讨论】:

    • 感谢您的帮助。事实证明,是的,页面和生成的 XML 文件中有一些非 UTF-8 内容,并导致了问题。但是,几个小时后,该页面基本上已经完全重新填充了新项目,并且问题得到了解决,而无需我进行任何更改。虽然我现在没有理由尝试它,但我想也许你的解决方案和 Manas Maji 的解决方案也可能会有所帮助。谢谢!
    猜你喜欢
    • 2012-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-21
    • 2023-02-17
    • 2013-07-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多