通过 xpath 在 org.w3c.dom 文档中查找节点永远需要并返回 null
我的 XpathUtility 类具有以下方法:
public Node findElementByXpath(Document doc, String axpath) throws Exception{
XPath xPath = XPathFactory.newInstance().newXPath();
Node node = (Node) xPath.evaluate(axpath, doc, XPathConstants.NODE);
return node;
}
在我的 main 中,我加载 org.w3c.dom 文档并尝试通过 xpath 定位元素:
XpathUtility xu = new XpathUtility();
Node foundElement= xu.findElementByXpath(domdoc, "/html[1]/body[1]/div[32]/a[1]");
我已通过 firebug 手动检查该元素是否存在使用该 xpath。
此代码运行时会发生什么情况:它挂起并无响应大约 30 秒,然后抛出 foundElement
的 NullPointerException
。
My XpathUtility class has following method:
public Node findElementByXpath(Document doc, String axpath) throws Exception{
XPath xPath = XPathFactory.newInstance().newXPath();
Node node = (Node) xPath.evaluate(axpath, doc, XPathConstants.NODE);
return node;
}
in my main I load a org.w3c.dom document and attempt to locate an element via xpath:
XpathUtility xu = new XpathUtility();
Node foundElement= xu.findElementByXpath(domdoc, "/html[1]/body[1]/div[32]/a[1]");
I have checked manually via firebug that element exists using that xpath.
What happens when this code runs: it hangs becomes unresponsive for about 30 seconds and then throws NullPointerException
for foundElement
.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
XHTML 文档是带有 DTD 引用的 XML 文档,XML 解析器必须下载并评估该文档,以便正确解析 XML 信息集,并且元素绑定到 XHTML 命名空间。
因此,看来您有两个问题:
XHTML DTD 需要很长时间才能完成从 W3C 网站下载。
<块引用>
W3C 服务器返回 DTD 的速度很慢。是否有延迟
故意的吗?
是的。由于各种软件系统从我们的网站下载 DTD
每天数百万次(尽管我们的缓存指令
服务器),我们已经开始从我们的网站提供 DTD
人为拖延。我们这样做的目的是让更多人关注
我们持续存在 DTD 流量过多的问题,并保护
我们网站其他部分的稳定性和响应时间。
您可以通过使用本地实体解析器来克服这个问题加载 DTD 的本地副本,而不是在每次请求时都访问 W3C 网站。
文档中的元素绑定到 XHTML 命名空间,但您使用的 XPath 与默认值无命名空间。
您可以采取多种措施来确保您的 XPath 与您想要的相符:
/*[local-name()='html' 和 namespace-uri( )='www.w3.org/1999/xhtml/'][1]/*[local-name()='body' 和namespace-uri()='www.w3.org/1999/xhtml/'][1]/*[local-name()='div' 和 namespace-uri()='www.w3.org/1999/ xhtml/'][32]/*[local-name()='a' 和 namespace-uri()='www.w3.org/1999/xhtml/'][1]
/*[local-name()='html'][1]/*[local-name()='body'][1]/*[local-name()='div'][ 32]/*[local-name()='a'][1]
An XHTML document is an XML document with a DTD reference, which XML parsers are obliged to download and evaluate in order to properly parse the XML infoset, and the elements are bound to the XHTML namespace.
So, it appears that you have two problems:
The XHTML DTD is taking a really long time to download from the W3C website.
You can overcome this by using a local entity resolver that loads a local copy of the DTD, rather than reaching out to the W3C website on every request.
The elements in the document are bound to the XHTML namespace, but you are using an XPath that is matching on the default no-namespace.
There are several things that you can do to ensure that your XPath matches what you want:
/*[local-name()='html' and namespace-uri()='www.w3.org/1999/xhtml/'][1]/*[local-name()='body' and namespace-uri()='www.w3.org/1999/xhtml/'][1]/*[local-name()='div' and namespace-uri()='www.w3.org/1999/xhtml/'][32]/*[local-name()='a' and namespace-uri()='www.w3.org/1999/xhtml/'][1]
/*[local-name()='html'][1]/*[local-name()='body'][1]/*[local-name()='div'][32]/*[local-name()='a'][1]