使用xpath从重复的子节点获取值

使用xpath从重复的子节点获取值,xpath,nodes,Xpath,Nodes,我正在构建一个java应用程序,使用xpath提取表标记中的值。 请给我一个有效的方法,从页面上获取所有200个值。我的代码对于包含第一个数据表的100行非常有效。但是,我没有办法到达第二个数据表。 我能够使用下面的java类提取它们。 预期产出 http://a.com/ data for a 526735 Z http://b.com/ data for b 522273 Z . . . . http://c.com/ data for c 578335 Z

我正在构建一个java应用程序,使用xpath提取表标记中的值。

请给我一个有效的方法,从页面上获取所有200个值。我的代码对于包含第一个数据表的100行非常有效。但是,我没有办法到达第二个数据表。

我能够使用下面的java类提取它们。

预期产出

http://a.com/   data for a  526735  Z
http://b.com/   data for b  522273  Z
.
.
.
.

http://c.com/   data for c  578335  Z  
http://d.com/   data for d  513445  Z


526735
Z
522273
B
.
.
这里是100行
.
这是用于获取数据的类

导入java.io.BufferedReader;
导入java.io.InputStream;
导入org.w3c.tidy.*;
导入java.io.InputStreamReader;
导入java.net.URL;
导入java.net.URLConnection;
导入java.util.ArrayList;
导入java.util.HashMap;
导入java.util.Iterator;
导入java.util.Map;
导入javax.xml.parsers.DocumentBuilderFactory;
导入javax.xml.xpath.xpath;
导入javax.xml.xpath.XPathConstants;
导入javax.xml.xpath.XPathExpression;
导入javax.xml.xpath.XPathFactory;
导入org.w3c.dom.Document;
导入org.w3c.dom.Element;
导入org.w3c.dom.NodeList;
导入org.w3c.tidy.Node;
导入org.w3c.tidy.tidy;
导入org.w3c.tidy.tidy;
公共类公司获得者{
公共静态void main(字符串[]args)引发异常{
字符串名称、链接、scripcode、组、s、键;
INTA=1;
整数计数=1;
URL oracle=新URL(“http://money.rediff.com/companies");
URLConnection yc=oracle.openConnection();
InputStream=yc.getInputStream();
is=oracle.openStream();
整洁的,整洁的;
整洁,安静(真);
整洁。设置显示警告(错误);
Document tidyDOM=tidy.parseDOM(is,null);
XPathFactory XPathFactory=XPathFactory.newInstance();
XPath=xPathFactory.newXPath();
Map mLink=new HashMap();
Map mCode=newhashmap();
Map mGroup=new HashMap();
ArrayList aName=新的ArrayList();

//对于(intj=0;jHm)来说,只是一个提示:您是否在XPath中使用变量“a”

link = "//table[@class='dataTable']/tbody/tr["+i+"]/td/a/@href";
应该是

link = "//table[@class='dataTable'][" + a + "]/tbody/tr["+i+"]/td/a/@href";

duh!!我没想到。非常感谢。你对代码怎么看。我能用某种方式优化它吗?事实上是的。我认为你应该使用节点列表,而不是在列表上逐个手动分页。原因是:1.在每个循环中,你的XPath都会在DOM上计算。2.表行的计数可能不同。(可能输入行的数量将动态增加)首先我尝试过使用节点列表,但由于对xpath和jaxp不熟悉,一切都很简单。如果您能详细说明您的解决方案,这会很有帮助。表行数是恒定的。但主要问题在于选择一行并获取d个child值,然后对n行重复该过程。