dom4j解析xml 最近在做关于爬虫的项目,通过抓取的网页,用jtidy解析转换成xml,然后通过dom4j去解析xml,得到网页中正文,标题之类的信息。因为解析出来的xml中,body里面子节点N多个(DIV),目前我的想法是,获取所有的DIV,然后得到DIV下的子节点H1,然后得到H1里面的文本信息。有没有类似经验的人给个建议???有代码最好。。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 xml有dom4j帮忙解析,没什么搞不定的,至于要抓取什么信息,那就是楼主自己的事情了,帮不了你。 直接循环取不就可以吗?<body><div><h1></h1></div><div><h1></h1></div</body>你说的是这样结构吧Element e=document.getRootElement();for(Iterator i=e.elementIterator();i.hasNext()){Element divElement=i.next();//得到div节点for(Iterator j=divElement.elementIterator();i.hasNaxt()){Element h1Element=j.next();if("H1".equals(h1Element.getName())){你要的东西}}} 把<DIV></DIV> 这种东东都删掉,得到一个干净的xml后再处理不行吗. 用dom4j,或者jdom,应该很快可以得到你想要的吧,除非你生成的xml规则太烂的话点功夫去做path的匹配。 用JDOM读取XML文件需先用org.jdom.input.SAXBuilder对象的build()方法创建Document对象,然后用Document类、Element类等的方法读取所需的内容。 text.xml<?xml version="1.0" encoding="UTF-8"?><HD> <disk name="C"> <capacity>8G</capacity> <directories>200</directories> <files>1580</files> </disk> <disk name="D"> <capacity>10G</capacity> <directories>500</directories> <files>3000</files> </disk></HD> 这里示范一下用jdom解析xml文件的步奏import java.util.*;import org.jdom.*;import org.jdom.input.SAXBuilder;public class Sample1 { public static void main(String[] args) throws Exception{ SAXBuilder sb=new SAXBuilder(); Document doc=sb.build(Sample1.class.getClassLoader().getResourceAsStream("text.xml")); //构造文档对象 Element root=doc.getRootElement(); //获取根元素HD List list=root.getChildren("disk");//取名字为disk的所有元素 for(int i=0;i<list.size();i++){ Element element=(Element)list.get(i); String capacity=element.getChildText("capacity");//取disk子元素capacity的内容 String directories=element.getChildText("directories"); String files=element.getChildText("files"); System.out.println("磁盘信息:"); System.out.println("分区盘符:"+name); System.out.println("分区容量:"+capacity); System.out.println("目录数:"+directories); System.out.println("文件数:"+files); System.out.println("-----------------------------------"); } }} 这只是一个入门,具体问题具体分析,呵呵 哥,用Jsoup吧 ,像js一样操作DOM,是不是非常方便呢?而且速度也很快 使用xpath吧,使用xpath查找指定的节点。 List listNodes=doc.selectNodes("//DIV");while循环获取,再取子节点。注意需要jaxen-xx-xx.jar。 Document doc = DocumentHelper.parseText(xml);List<?> printXmls = doc.selectNodes("/div");//选择节点String H1="";if((printXmls != null) && (printXmls.size()>0)){for (int i = 0; i < printXmls .size(); i++) { Element printe = (Element)printXmls.get(i); H1= StringUtils.trimToNull(printe.elementText("H1"));//H1} 各位大哥有用TCP协议开发服务器端的吗? 谈谈spring事务管理 有关hibernate的一个简单问题 今天面试遇到的问题? spring2 是如何找到bean的 关于Wsdl测试的问题 高分求解决tomcat异常 关于flex 请问什么开发工具开发桌面应用程序网络版最容易,最迅速 关于分页,对结果操作,导出到excel的问题 spring的aop错误 项目开启的时候报错。
<body>
<div>
<h1>
</h1>
</div>
<div>
<h1>
</h1>
</div
</body>
你说的是这样结构吧
Element e=document.getRootElement();
for(Iterator i=e.elementIterator();i.hasNext()){
Element divElement=i.next();//得到div节点
for(Iterator j=divElement.elementIterator();i.hasNaxt()){
Element h1Element=j.next();
if("H1".equals(h1Element.getName())){
你要的东西
}
}
}
<HD>
<disk name="C">
<capacity>8G</capacity>
<directories>200</directories>
<files>1580</files>
</disk> <disk name="D">
<capacity>10G</capacity>
<directories>500</directories>
<files>3000</files>
</disk>
</HD>
这里示范一下用jdom解析xml文件的步奏import java.util.*;
import org.jdom.*;
import org.jdom.input.SAXBuilder;
public class Sample1 {
public static void main(String[] args) throws Exception{
SAXBuilder sb=new SAXBuilder();
Document doc=sb.build(Sample1.class.getClassLoader().getResourceAsStream("text.xml")); //构造文档对象
Element root=doc.getRootElement(); //获取根元素HD
List list=root.getChildren("disk");//取名字为disk的所有元素
for(int i=0;i<list.size();i++){
Element element=(Element)list.get(i);
String capacity=element.getChildText("capacity");//取disk子元素capacity的内容
String directories=element.getChildText("directories");
String files=element.getChildText("files");
System.out.println("磁盘信息:");
System.out.println("分区盘符:"+name);
System.out.println("分区容量:"+capacity);
System.out.println("目录数:"+directories);
System.out.println("文件数:"+files);
System.out.println("-----------------------------------");
}
}
} 这只是一个入门,具体问题具体分析,呵呵
List<?> printXmls = doc.selectNodes("/div");//选择节点
String H1="";
if((printXmls != null) && (printXmls.size()>0)){
for (int i = 0; i < printXmls .size(); i++) {
Element printe = (Element)printXmls.get(i);
H1= StringUtils.trimToNull(printe.elementText("H1"));//H1
}