自学了一下dom4j的应用,下面是主要的代码片段,附件中有eclipse的工程源码,导入eclipse运行即可,注意:
必须导入两个包,一个是
dom4j-1.6.1.jar(我用的是这个),另外一个是
jaxen-1.1.1.jar(使用xpath解析时必
需要这个包)
//表示查找boardroom属性id=id的元素
Element e = Dom4jXmlUtil.xPathOneElement(doc, "//boardrooms/boardroom[@id='" + id+ "']");
//表示查询boardroom下元素name值为name的元素
Element e = Dom4jXmlUtil.xPathOneElement(doc, "//boardrooms/boardroom[name='" + name + "']");
ParseXML.java
package my.xml;
import java.util.Iterator;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
public class ParseXML {
/**
* 把Document解析成String
* @param doc
* @throws DocumentException
*/
public void printXmlToString(Document doc) throws DocumentException {
String text = doc.asXML();
System.out.println(text);
}
/**
* 采用迭代器解析xml
* @param doc
* @throws DocumentException
*/
@SuppressWarnings("unchecked")
public void printXmlByIt(Document doc) throws DocumentException {
Element e = doc.getRootElement();
for (Iterator it = e.elementIterator("webSite"); it.hasNext();) {
Element element = (Element) it.next();
String url = element.attributeValue("href");
System.out.println(url);
}
return;
}
/**
* 通过Element来解析xml
* @param doc
* @throws DocumentException
*/
@SuppressWarnings("unchecked")
public void printXmlByElement(Document doc) throws DocumentException {
Element element = doc.getRootElement();
List<Element> lst = element.elements("webSite");
for(Element e : lst){
List<Element> tLst = e.elements("title");
for(Element e2 : tLst){
String eString = e2.getText();//获取title节点的内容
System.out.println(eString);
}
}
return;
}
/**
* 通过xpath来解析xml
* 注意:必须导入jaxen-1.1.1.jar,否则有异常
* @param doc
*/
@SuppressWarnings("unchecked")
public void printXmlByXpath(Document doc) {
try {
Node root = doc.selectSingleNode("//webSites");// 从Document开始时需要加两个/
/**
* 是读取刚才加载的xml文档内的webSites节点下的所有内容,对于本例也是整个xml文档。
* 如果要加载webSites下的某个节点,如:Node root = doc.selectSingleNode("//webSites/webSite");
*/
List list = root.selectNodes("webSite[@href='www.baidu.com']");//获取webSites下webSite节点
/**
* 它的意思就是读取webSites节点下的webSite节点,且webSite的节点的href属性为www.baidu.com
* 为什么使用list来接收呢,如果有两个webSite节点,且它们的href属性都为www.baidu.com,此时就封闭到list里了。
* 如果要获取webSites下所有的webSite节点,可以这么写List list = root.selectNodes("webSite");
*/
for (Object o : list) {
Element e = (Element) o;
String open = e.attributeValue("open");//获取节点webSite上的open属性值
System.out.println("open = " + open);
}
List listTitle = root.selectNodes("webSite[@href='www.163.com']/title[@id='3_1']");//获取webSites下webSite下title节点
for (Object o : listTitle) {
Element e = (Element) o;
String id = e.attributeValue("id");
System.out.println("id = " + id);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}