gpt4 book ai didi

Java XML 解析器 block (非常不寻常和奇怪!)

转载 作者:行者123 更新时间:2023-11-29 08:14:51 25 4
gpt4 key购买 nike

我有一个很奇怪的案例:

我尝试使用默认的 Java XML 解析器解析几个符合 XHTML 的网站。解析期间(不是下载期间)的测试 block 。

这可能是一个错误,还是解析器在解析期间尝试下载额外的引用资源(这将是一个“不错的”反特征)?

使用简单的数据,它就可以工作。 (测试1)
对于复杂的数据,它会阻塞。 (测试2)
(我尝试了 en.wikipedia.orgvalidator.w3.org)

当发生阻塞时,CPU 是空闲的。

用JDK6和JDK7测试,结果一样。

请查看测试用例,源已准备好复制 + 粘贴 + 运行。

来源

import java.io.*;
import java.net.*;
import java.nio.charset.*;
import javax.xml.parsers.*;
import javax.xml.transform.*;
import javax.xml.transform.dom.*;
import javax.xml.transform.stream.*;
import org.w3c.dom.*;

public class _XmlParsingBlocks {

private static Document parseXml(String data)
throws Exception {
Transformer t = TransformerFactory.newInstance().newTransformer();
DocumentBuilder b = DocumentBuilderFactory.newInstance().newDocumentBuilder();
DOMResult out = new DOMResult(b.newDocument());
t.transform(new StreamSource(new StringReader(data)), out);
return (Document) out.getNode();
}

private static byte[] streamToByteArray(InputStream is)
throws IOException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();

for (;;) {
byte[] buffer = new byte[256];
int count = is.read(buffer);
if (count == -1) {
is.close();
break;
}
baos.write(buffer, 0, count);
}

return baos.toByteArray();
}

private static void test(byte[] data)
throws Exception {
String asString = new String(data, Charset.forName("UTF-8"));

System.out.println("===== PARSING STARTED =====");
Document doc = parseXml(asString);
System.out.println("===== PARSING ENDED =====");
}

public static void main(String[] args)
throws Exception {
{
System.out.println("********** TEST 1");
test("<html>test</html>".getBytes("UTF-8"));
}

{
System.out.println("********** TEST 2");
URL url = new URL("http://validator.w3.org/");
URLConnection connection = url.openConnection();
InputStream is = connection.getInputStream();
byte[] data = streamToByteArray(is);
System.out.println("===== DOWNLOAD FINISHED =====");

test(data);
}
}

}

输出

********** TEST 1
===== PARSING STARTED =====
===== PARSING ENDED =====
********** TEST 2
===== DOWNLOAD FINISHED =====
===== PARSING STARTED =====

[here it blocks]

最佳答案

W3C 在过去几个月开始阻止对常见 DTD(例如 XHTML DTD)的请求——它们无法处理所产生的流量。如果您不使用缓存 DTD 的代理服务器,则需要使用 EntityResolver 或目录将引用重定向到本地副本。

关于Java XML 解析器 block (非常不寻常和奇怪!),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5519579/

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