gpt4 book ai didi

java - 在 Java 中从 URL 解析 XML 时出现 MalformedByteSequenceException

转载 作者:行者123 更新时间:2023-12-01 13:01:57 26 4
gpt4 key购买 nike

我正在尝试使用以下代码解析 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());

但我仍然遇到完全相同的错误。如何使用不同的编码来解析 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);

最佳答案

行为上的差异如下:

在浏览器中访问 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 文档。

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

关于java - 在 Java 中从 URL 解析 XML 时出现 MalformedByteSequenceException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23452823/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com