Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java XPath可以';无法按id查找表_Java_Xpath_Watij - Fatal编程技术网

Java XPath可以';无法按id查找表

Java XPath可以';无法按id查找表,java,xpath,watij,Java,Xpath,Watij,我正在使用WATIJ进行一些屏幕抓取,但它无法读取HTML表(抛出NullPointerException或UnknownObjectException)。为了克服这个问题,我阅读了HTML并通过JTidy运行它以获得格式良好的XML 我想用XPath解析它,但它找不到byid的,即使该表在XML平原中也是如此。这是我的密码: XPathFactory factory=XPathFactory.newInstance(); XPath xPath=factory.newXPath();

我正在使用WATIJ进行一些屏幕抓取,但它无法读取HTML表(抛出NullPointerException或UnknownObjectException)。为了克服这个问题,我阅读了HTML并通过JTidy运行它以获得格式良好的XML

我想用XPath解析它,但它找不到
by
id
,即使该表在XML平原中也是如此。这是我的密码:

XPathFactory factory=XPathFactory.newInstance();  
XPath xPath=factory.newXPath();  
InputSource inputSource = new InputSource(new StringReader(tidyHtml));  
XPathExpression xPathExpression=xPath.compile("//table[@id='searchResult']");  
String expression = "//table[@id='searchResult']";
String table = xPath.evaluate(expression, inputSource);
System.out.println("table = " + table);
该表是一个空字符串

但是,该表是XML格式的。如果我打印它显示的
tidyHtml
字符串

 <table
   class="ApptableDisplayTag"
   id="searchResult"
   style="WIDTH: 99%">

我以前没有使用过XPath,所以可能我遗漏了一些东西


有人能帮我澄清一下吗?谢谢。

我从未直接使用过Java的XPathAPI,我总是通过其他语言(Perl和C)使用它。但我很了解它是如何正常工作的。首先,您可能应该将输入解析为DOM文档,这将非常有帮助。另外,如果您知道您的文档具有ID,那么您应该通过加载DTD或模式来解析它,以这种方式描述文档,XML解析器将标记并标识具有适当ID的节点。完成此操作后,可以将代码与DOM树一起使用

[XPath.evaluate(expression,item)](显示第二个元素应该是一个节点或节点列表。这可能就是为什么会有大量的UnknowNobjectException

如果XML解析器能够识别ID元素,则可以使用以下XPath表达式访问具有ID的元素:

XPathExpression xPathExpression=xPath.compile("id('searchResult')");
xPathExpression.evaluate(document); // document is a DOM document instance

使用XPath函数是访问元素最有效的方法,也就是当元素使用ID并且在DTD或模式中以这种方式声明时。

您的XPath是正确的……不管失败的是什么,都不是。

看起来问题主要出在JTidy上。我可以使用XPath解析JTidy ied通过执行以下操作获得结果:

import watij.runtime.ie.IE; import static watij.finders.SymbolFactory.*; public class Example { public static void main(String[] args) { IE ie = new IE(); ie.start("your_url_goes_here"); System.out.println(ie.table(xpath, "//TABLE[@id='searchResult']").rowCount()); ie.close(); } } 删除所有“nbsp;”。JTidy返回标记外带有“nbsp;”的xhtml。 移除 在标记中删除xmlns=…属性 移除“头部”标签。 (我使用了一些有趣的格式,因为正确键入时不会显示HTML实体)

JTyy也在文本内容的中间放置换行符,如果……元素,

我必须看看其他HTML->XML转换选项。我给了Cobra一个快速的尝试,但它也无法通过Id找到我的表。我没有尝试手动清理Cobra的结果,所以我不知道它与JTidy相比如何


如果您知道一个返回良好XML的HTML解析器,请告诉我。

我对JTidy一无所知,但对于WATIJ来说,我认为您获得NullPointer和UnknownObject异常的原因是因为您的XPATH使用小写节点。因此,假设您使用的是“//table[@id='searchResult']”作为在WATIJ中查找表的xpath。这实际上不起作用,因为“table”是小写的。对于WATIJ,您需要将所有节点名都用大写,例如:“//table[@id='searchResult']”。例如,如果要使用WATIJ打印该表的行数,您可以执行以下操作:

import watij.runtime.ie.IE; import static watij.finders.SymbolFactory.*; public class Example { public static void main(String[] args) { IE ie = new IE(); ie.start("your_url_goes_here"); System.out.println(ie.table(xpath, "//TABLE[@id='searchResult']").rowCount()); ie.close(); } } 导入watij.runtime.ie.ie; 导入静态watij.finders.SymbolFactory.*; 公开课范例{ 公共静态void main(字符串[]args){ IE=新IE(); 即开始(“你的url在这里”); System.out.println(ie.table(xpath,//table[@id='searchResult'])).rowCount(); 即关闭(); } }
这段代码或答案可能不正确,因为我今天才开始使用WATIJ。尽管我在XPath上遇到了同样的问题。我花了几个小时的搜索/测试才注意到所有XPath都是如何在这一页上显示的:一旦我在XPath中更改了大小写,WATIJ就能够找到对象,所以这应该可以在或者你也可以。

解决方案是放弃WATIJ并切换到Google WebDriver。WebDriver记录了不同浏览器如何在xpath语句中处理大小写。

绝对不需要双引号,大写也不需要。名称空间和/或DTD更可能是答案。

Uniue ID属性需要通过ID()方法
id('search')

观察良好。Google WebDriver文档提到xpath语句的大小写敏感度取决于您使用的浏览器。