Element root = document.getRootElement();
List recordenvlist = document.selectNodes("//gml:envelope"); //gml:envelope
提示 NoClassDefFoundError org.dom4j.DocumentFactory.createXPath 原因:dom4j的xpath api依赖jaxen完成解决方法:在系统中加入jaxen.jar.jaxen.jar下载路径:http://jaxen.codehaus.org/releases.htmldom4j-1.6.1.jar下载路http://nchc.dl.sourceforge.net/sourceforge/dom4j/dom4j-1.6.1.jar
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
使用dom4j的xPath解析XML
一般的XML
国外的dom4j已经很流行了,国内的相关资料相对较少,但普及风暴也即将到来。我们公司(老外开的)解析XML就是用的dom4j。
今天公司没事做,自己也写一个小例子贴上来,嘻~~
- books.xml:
- xml version="1.0" encoding="UTF-8"?>
- <books>
- <book show&#61;"yes" url&#61;"lucene.net">
- <title id&#61;"456">Lucene Studingtitle>
- book>
- <book show&#61;"yes" url&#61;"dom4j.com">
- <title id&#61;"123">Dom4j Tutorialstitle>
- book>
- <book show&#61;"no" url&#61;"spring.org">
- <title id&#61;"789">Spring in Actiontitle>
- book>
- <owner>O&#39;Reillyowner>
- books>
下面我们使用dom4j的xPath来解析&#xff1a;
- segment of ParseXML.java:
- public void parseBooks(){
- SAXReader reader &#61; new SAXReader();
- try {
- Document doc &#61; reader.read("books.xml");
- Node root &#61; doc.selectSingleNode("/books");
- List list &#61; root.selectNodes("book[&#64;url&#61;&#39;dom4j.com&#39;]");
- for(Object o:list){
- Element e &#61; (Element) o;
- String show&#61;e.attributeValue("show");
- System.out.println("show &#61; " &#43; show);
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
Document doc &#61; reader.read("books.xml");的意思是加载XML文档&#xff0c;此是可以用doc.asXML()来查看&#xff0c;它将打印整个xml文档。
Node root &#61; doc.selectSingleNode("/books");是读取刚才加载的xml文档内的books节点下的所有内容&#xff0c;对于本例也是整个xml文档。
当然我们也可以加载/books下的某一个节点&#xff0c;如&#xff1a;book节点
Node root &#61; doc.selectSingleNode("/books/book");
或&#xff1a;Node root &#61; doc.selectSingleNode("/books/*");
注意&#xff1a;如果有多个book节点&#xff0c;它只会读取第一个
root.asXML()将打印&#xff1a;
既然加载了这么多&#xff0c;那我怎么精确的得到我想要的节点呢&#xff0c;别急&#xff0c;看下面&#xff1a;
List list &#61; root.selectNodes("book[&#64;url&#61;&#39;dom4j.com&#39;]");
它的意思就是读取books节点下的book节点&#xff0c;且book的节点的url属性为dom4j.com
为什么使用list来接收呢&#xff0c;如果有两个book节点&#xff0c;且它们的url属性都为dom4j.com&#xff0c;此时就封闭到list里了。
如果想读取books下的所有book节点&#xff0c;可以这样&#xff1a;
List list &#61; root.selectNodes("book");
如果想读取books节点下的book节点下的title节点&#xff0c;可以这样&#xff1a;
List list2 &#61; root.selectNodes("book[&#64;url&#61;&#39;dom4j.com&#39;]/title[&#64;id&#61;&#39;123&#39;]");
注意&#xff1a;selectNodes()参数的格式&#xff1a;
节点名[&#64;属性名&#61;&#39;属性值&#39;]&#xff0c;如&#xff1a;book[&#64;url&#61;&#39;dom4j.com&#39;]
如果有多个节点&#xff0c;用“/”分开&#xff0c;如&#xff1a;book[&#64;url&#61;&#39;dom4j.com&#39;]/title[&#64;id&#61;&#39;123&#39;]
最近就是读取封闭在List里的内容了&#xff0c;可以用Node来读取&#xff0c;也可以用Element来转换。
attributeValue("属性")是读取该节点的属性值
getText()是读取节点的的内容。
以上载自。。。。sorry不记得了
要注意的是。在dom4j使用selectNodes等操作时要加上另一个包jaxen-1.1.1.jar
带命名空间的XML
在XML根节点出现
或
因为dom4j不能识别带命名空间的节点&#xff0c;所以在读取带命名空间的XML时&#xff0c;要在每个节点前加上命名空间&#xff0c;方法如下例子&#xff1a;
- Map nsMap &#61; null;
- &#64;SuppressWarnings("unchecked")
- public void readXml(String xml) throws DocumentException{
- Document doc &#61; DocumentHelper.parseText(xml);
- nsMap &#61; new HashMap();
- String defaultNamespace &#61; doc.getRootElement().getNamespaceURI();
- nsMap.put("default", defaultNamespace);
- //创建解析路径&#xff0c;就是在普通的解析路径前加上map里的key值
- XPath x &#61; doc.createXPath("//default:outputdatas/default:results/"
- &#43; "default:result[&#64;set_id&#61;&#39;201&#39;]"
- &#43; "/default:row/default:col[&#64;param_id&#61;&#39;201001&#39;]");
- x.setNamespaceURIs(nsMap);
- List
nodes &#61; x.selectNodes(doc); - Node node &#61; x.selectSingleNode(doc);
- }
相信聪明的你。。一看就明白啦。。就不用注释啦
转自 http://lovell.iteye.com/blog/625662