从Java中的URL解析XML时出现MalformedByteSequenceException

时间:2014-05-04 05:03:05

标签: java xml xml-parsing

我尝试使用以下代码解析XML:

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse(new URL("http://www.cinemark.com.br/mobile/xml/films/").openStream());

但是得到以下错误:

com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException: Invalid byte 1 of 1-byte UTF-8 sequence.
    at com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.invalidByte(UTF8Reader.java:687)
    at com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.read(UTF8Reader.java:557)
    at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.load(XMLEntityScanner.java:1753)
    at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.arrangeCapacity(XMLEntityScanner.java:1629)
    at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.skipString(XMLEntityScanner.java:1667)
    at com.sun.org.apache.xerces.internal.impl.XMLVersionDetector.determineDocVersion(XMLVersionDetector.java:196)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:812)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:777)
    at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141)
    at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:243)
    at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:347)
    at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:121)
    at Programacao.main(Programacao.java:53)

访问the url,你可以看到有一些葡萄牙语字符,看到响应,我可以看到xml文件的第一行:

<?xml version="1.0" encoding="iso-8859-1"?>

所以我试着这样做:

URL url = new URL("http://www.cinemark.com.br/mobile/xml/films/");

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();

InputStream ism = url.openStream();
InputSource is = new InputSource(ism);
is.setEncoding("iso-8859-1");

Document doc = db.parse(is.getByteStream());

但我仍然得到了完全相同的错误。 如何使用不同的encondig解析xml?

另外,我怎么知道xml是否真的采用文件中描述的编码?

我在Fedora Linux 20上使用JDK 1.7.0_51

由于

我根据Seelenvirtuose答案解决了这个问题:

URL url = new URL("http://www.cinemark.com.br/mobile/xml/films/");

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();

InputStream ism = url.openStream();
GZIPInputStream gis = new GZIPInputStream(ism);
Reader decoder = new InputStreamReader(gis);
InputSource is = new InputSource(decoder);

Document doc = db.parse(is);

1 个答案:

答案 0 :(得分:1)

行为的差异如下:

在浏览器中访问URL时,会在一段时间后显示:

<?xml version="1.0" encoding="iso-8859-1"?>
<cinemark>
  <films>
    <film ...>...</film>
    ...
  </films>
</cinemark>

但是,当只是运行curl(例如)时,您会得到类似于的输出:

‹      ¬YMsÛ6½ûW`xôT¨Oªc) [...]

那么,究竟发生了什么?简单:这称为HTTP compresson。所以在运行以下命令时

  

curl -o films.zip http://www.cinemark.com.br/mobile/xml/films/

您将获得一个名为films.zip的文件,其中包含一个名为films的文件,该文件又包含预期的XML文档。

因此,您应该做的是:将输出流作为压缩流,提取内容并解析。