import@H_301_3@java.io.PrintWriter;@H_301_3@@H_301_3@
- import@H_301_3@javax.xml.parsers.DocumentBuilder;@H_301_3@@H_301_3@
- import@H_301_3@javax.xml.parsers.DocumentBuilderFactory;@H_301_3@@H_301_3@
- import@H_301_3@javax.xml.parsers.ParserConfigurationException;@H_301_3@@H_301_3@
- import@H_301_3@javax.xml.transform.OutputKeys;@H_301_3@@H_301_3@
- import@H_301_3@javax.xml.transform.Transformer;@H_301_3@@H_301_3@
- import@H_301_3@javax.xml.transform.TransformerConfigurationException;@H_301_3@@H_301_3@
- import@H_301_3@javax.xml.transform.TransformerException;@H_301_3@@H_301_3@
- import@H_301_3@javax.xml.transform.TransformerFactory;@H_301_3@@H_301_3@
- import@H_301_3@javax.xml.transform.dom.DOMSource;@H_301_3@@H_301_3@
- import@H_301_3@javax.xml.transform.stream.StreamResult;@H_301_3@@H_301_3@
- import@H_301_3@org.w3c.dom.Attr;@H_301_3@@H_301_3@
- import@H_301_3@org.w3c.dom.Document;@H_301_3@@H_301_3@
- import@H_301_3@org.w3c.dom.Element;@H_301_3@@H_301_3@
- import@H_301_3@org.w3c.dom.Node;@H_301_3@@H_301_3@
- import@H_301_3@org.w3c.dom.NodeList;@H_301_3@@H_301_3@
- import@H_301_3@org.xml.sax.SAXException;@H_301_3@@H_301_3@
- *DOM生成与解析XML文档@H_301_3@@H_301_3@
- *@H_301_3@@H_301_3@
- *@author莫小哆_ly2012-2-20@H_301_3@@H_301_3@
- public@H_301_3@@H_301_3@class@H_301_3@DomDemo{@H_301_3@@H_301_3@
- /*@H_301_3@@H_301_3@
- *解析器读入整个文档,然后构建一个驻留内存的树结构,@H_301_3@@H_301_3@
- *@H_301_3@@H_301_3@
- *然后代码就可以使用DOM接口来操作这个树结构。@H_301_3@@H_301_3@
- *优点:整个文档树在内存中,便于操作;支持删除、修改、重新排列等多种功能;@H_301_3@@H_301_3@
- *缺点:将整个文档调入内存(包括无用的节点),浪费时间和空间;@H_301_3@@H_301_3@
- *使用场合:一旦解析了文档还需多次访问这些数据;硬件资源充足(内存、cpu)@H_301_3@@H_301_3@
- //表示整个HTML或XML文档。从概念上讲,它是文档树的根,并提供对文档数据的基本访问@H_301_3@@H_301_3@@H_301_3@
- private@H_301_3@Documentdocument;@H_301_3@@H_301_3@
- *创建DOM树@H_301_3@@H_301_3@
- *要读入一个XML文档,首先要一个DocumentBuilder对象@H_301_3@@H_301_3@
- public@H_301_3@@H_301_3@void@H_301_3@init(){@H_301_3@@H_301_3@
- //获取DocumentBuilderFactory的新实例@H_301_3@@H_301_3@@H_301_3@
- DocumentBuilderFactoryfactory=DocumentBuilderFactory.newInstance();@H_301_3@
- //使用当前配置的参数创建一个新的DocumentBuilder实例@H_301_3@@H_301_3@@H_301_3@
- DocumentBuilderbuilder=null@H_301_3@;@H_301_3@@H_301_3@
- builder=factory.newDocumentBuilder();@H_301_3@
- }catch@H_301_3@(ParserConfigurationExceptione){@H_301_3@@H_301_3@
- e.printStackTrace();@H_301_3@
- //获取DOMDocument对象的一个新实例来生成一个DOM树@H_301_3@@H_301_3@@H_301_3@
- this@H_301_3@.document=builder.newDocument();@H_301_3@@H_301_3@
- *xml文档的写入操作@H_301_3@@H_301_3@
- *@paramfile@H_301_3@@H_301_3@
- //创建DOM树@H_301_3@@H_301_3@@H_301_3@
- this@H_301_3@.init();@H_301_3@@H_301_3@
- //创建XML根节点employees@H_301_3@@H_301_3@@H_301_3@
- Elementroot=this@H_301_3@.document.createElement(@H_301_3@"employees"@H_301_3@);@H_301_3@@H_301_3@
- //AddsthenodenewChildtotheendofthelistofchildrenofthis@H_301_3@@H_301_3@@H_301_3@
- //node.@H_301_3@@H_301_3@@H_301_3@
- //IfthenewChildisalreadyinthetree,itisfirstremoved.@H_301_3@@H_301_3@@H_301_3@
- this@H_301_3@.document.appendChild(root);@H_301_3@@H_301_3@
- //1.创建根节点的子节点employee@H_301_3@@H_301_3@@H_301_3@
- Elementemployee=this@H_301_3@.document.createElement(@H_301_3@"employee"@H_301_3@);@H_301_3@@H_301_3@
- //向根节点添加属性节点@H_301_3@@H_301_3@@H_301_3@
- Attrid=this@H_301_3@.document.createAttribute(@H_301_3@"id"@H_301_3@);@H_301_3@@H_301_3@
- id.setNodeValue("0001"@H_301_3@);@H_301_3@@H_301_3@
- //把属性节点对象,追加到达employee节点;@H_301_3@@H_301_3@@H_301_3@
- employee.setAttributeNode(id);@H_301_3@
- //声明employee的子节点name@H_301_3@@H_301_3@@H_301_3@
- Elementname=this@H_301_3@.document.createElement(@H_301_3@"name"@H_301_3@);@H_301_3@@H_301_3@
- //向XML文件name节点追加数据@H_301_3@@H_301_3@@H_301_3@
- name.appendChild(this@H_301_3@.document.createTextNode(@H_301_3@"wanglp"@H_301_3@));@H_301_3@@H_301_3@
- //把子节点的属性追加到employee子节点中元素中@H_301_3@@H_301_3@@H_301_3@
- employee.appendChild(name);@H_301_3@
- //声明employee的子节点sex@H_301_3@@H_301_3@@H_301_3@
- Elementsex=this@H_301_3@.document.createElement(@H_301_3@"sex"@H_301_3@);@H_301_3@@H_301_3@
- //向XML文件sex节点追加数据@H_301_3@@H_301_3@@H_301_3@
- sex.appendChild(this@H_301_3@.document.createTextNode(@H_301_3@"m"@H_301_3@));@H_301_3@@H_301_3@
- //把子节点的属性追加到employee子节点中元素中@H_301_3@@H_301_3@@H_301_3@
- employee.appendChild(sex);@H_301_3@
- //声明employee的子节点age@H_301_3@@H_301_3@@H_301_3@
- Elementage=this@H_301_3@.document.createElement(@H_301_3@"age"@H_301_3@);@H_301_3@@H_301_3@
- //向XML文件age节点追加数据@H_301_3@@H_301_3@@H_301_3@
- age.appendChild(this@H_301_3@.document.createTextNode(@H_301_3@"25"@H_301_3@));@H_301_3@@H_301_3@
- employee.appendChild(age);@H_301_3@
- //employee节点定义完成,追加到root@H_301_3@@H_301_3@@H_301_3@
- root.appendChild(employee);@H_301_3@
- //2.创建根节点的子节点employee@H_301_3@@H_301_3@@H_301_3@
- employee=this@H_301_3@.document.createElement(@H_301_3@"employee"@H_301_3@);@H_301_3@@H_301_3@
- //向根节点添加属性节点@H_301_3@@H_301_3@@H_301_3@
- id=this@H_301_3@.document.createAttribute(@H_301_3@"id"@H_301_3@);@H_301_3@@H_301_3@
- id.setNodeValue("0002"@H_301_3@);@H_301_3@@H_301_3@
- //把属性节点对象,追加到达employee节点;@H_301_3@@H_301_3@@H_301_3@
- employee.setAttributeNode(id);@H_301_3@
- //声明employee的子节点name@H_301_3@@H_301_3@@H_301_3@
- name=this@H_301_3@.document.createElement(@H_301_3@"name"@H_301_3@);@H_301_3@@H_301_3@
- //向XML文件name节点追加数据@H_301_3@@H_301_3@@H_301_3@
- name.appendChild(this@H_301_3@.document.createTextNode(@H_301_3@"huli"@H_301_3@));@H_301_3@@H_301_3@
- employee.appendChild(name);@H_301_3@
- //声明employee的子节点sex@H_301_3@@H_301_3@@H_301_3@
- sex=this@H_301_3@.document.createElement(@H_301_3@"sex"@H_301_3@);@H_301_3@@H_301_3@
- //向XML文件sex节点追加数据@H_301_3@@H_301_3@@H_301_3@
- sex.appendChild(this@H_301_3@.document.createTextNode(@H_301_3@"f"@H_301_3@));@H_301_3@@H_301_3@
- employee.appendChild(sex);@H_301_3@
- //声明employee的子节点age@H_301_3@@H_301_3@@H_301_3@
- age=this@H_301_3@.document.createElement(@H_301_3@"age"@H_301_3@);@H_301_3@@H_301_3@
- //向XML文件age节点追加数据@H_301_3@@H_301_3@@H_301_3@
- age.appendChild(this@H_301_3@.document.createTextNode(@H_301_3@"12"@H_301_3@));@H_301_3@@H_301_3@
- employee.appendChild(age);@H_301_3@
- //employee节点定义完成,追加到root@H_301_3@@H_301_3@@H_301_3@
- root.appendChild(employee);@H_301_3@
- //获取TransformerFactory的新实例。@H_301_3@@H_301_3@@H_301_3@
- TransformerFactorytf=TransformerFactory.newInstance();@H_301_3@
- //创建执行从Source到Result的复制的新Transformer。能够将源树转换为结果树@H_301_3@@H_301_3@@H_301_3@
- Transformertransformer=null@H_301_3@;@H_301_3@@H_301_3@
- transformer=tf.newTransformer();@H_301_3@
- }catch@H_301_3@(TransformerConfigurationExceptione){@H_301_3@@H_301_3@
- //设置转换中实际的输出属性@H_301_3@@H_301_3@@H_301_3@
- //指定首选的字符编码@H_301_3@@H_301_3@@H_301_3@
- transformer.setOutputProperty(OutputKeys.ENCODING,"UTF-8"@H_301_3@);@H_301_3@@H_301_3@
- //indent="yes"|"no".指定了当输出结果树时,Transformer是否可以添加额外的空白@H_301_3@@H_301_3@@H_301_3@
- transformer.setOutputProperty(OutputKeys.INDENT,"yes"@H_301_3@);@H_301_3@@H_301_3@
- //声明文件流@H_301_3@@H_301_3@@H_301_3@
- PrintWriterpw=null@H_301_3@;@H_301_3@@H_301_3@
- pw=new@H_301_3@PrintWriter(@H_301_3@new@H_301_3@FileOutputStream(file));@H_301_3@@H_301_3@
- System.out.println("文件没有找到!"@H_301_3@);@H_301_3@@H_301_3@
- //充当转换结果的持有者,可以为XML、纯文本、HTML或某些其他格式的标记@H_301_3@@H_301_3@@H_301_3@
- StreamResultresult=new@H_301_3@StreamResult(pw);@H_301_3@@H_301_3@
- //DOMSourceimplementsSource@H_301_3@@H_301_3@@H_301_3@
- DOMSourcesource=new@H_301_3@DOMSource(document);@H_301_3@@H_301_3@
- //将XMLSource转换为Result@H_301_3@@H_301_3@@H_301_3@
- transformer.transform(source,result);@H_301_3@
- }catch@H_301_3@(TransformerExceptione){@H_301_3@@H_301_3@
- System.out.println("生成XML文件失败!"@H_301_3@);@H_301_3@@H_301_3@
- System.out.println("生成XML文件成功!"@H_301_3@);@H_301_3@@H_301_3@
- *xml文档的读取操作@H_301_3@@H_301_3@
- DocumentBuilderbuilder;@H_301_3@
- //将给定URI的内容解析为一个XML文档,并且返回一个新的DOMDocument对象@H_301_3@@H_301_3@@H_301_3@
- document=builder.parse(file);@H_301_3@
- }catch@H_301_3@(SAXExceptione){@H_301_3@@H_301_3@
- //获得文档根元素对对象;@H_301_3@@H_301_3@@H_301_3@
- Elementroot=document.getDocumentElement();@H_301_3@
- //获得文档根元素下一级子元素所有元素;@H_301_3@@H_301_3@@H_301_3@
- NodeListnodeList=root.getChildNodes();@H_301_3@
- System.out.print("<employees>"@H_301_3@);@H_301_3@@H_301_3@
- System.out.println(root.getNodeName());@H_301_3@
- if@H_301_3@(@H_301_3@null@H_301_3@!=root){@H_301_3@@H_301_3@
- for@H_301_3@(@H_301_3@int@H_301_3@i=@H_301_3@0@H_301_3@;i<nodeList.getLength();i++){@H_301_3@@H_301_3@
- Nodechild=nodeList.item(i);@H_301_3@
- //输出child的属性;@H_301_3@@H_301_3@@H_301_3@
- System.out.print("<test>"@H_301_3@);@H_301_3@@H_301_3@
- System.out.println(child);@H_301_3@
- if@H_301_3@(child.getNodeType()==Node.ELEMENT_NODE){@H_301_3@@H_301_3@
- System.out.print("<id>"@H_301_3@);@H_301_3@@H_301_3@
- System.out.println(child.getAttributes().getNamedItem("id"@H_301_3@).getNodeValue());@H_301_3@@H_301_3@
- for@H_301_3@(Nodenode=child.getFirstChild();node!=@H_301_3@null@H_301_3@;node=node.getNextSibling()){@H_301_3@@H_301_3@
- if@H_301_3@(node.getNodeType()==Node.ELEMENT_NODE){@H_301_3@@H_301_3@
- if@H_301_3@(@H_301_3@"name"@H_301_3@.equals(node.getNodeName())){@H_301_3@@H_301_3@
- System.out.print("<name>"@H_301_3@);@H_301_3@@H_301_3@
- System.out.println(node.getFirstChild().getNodeValue());@H_301_3@
- if@H_301_3@(@H_301_3@"sex"@H_301_3@.equals(node.getNodeName())){@H_301_3@@H_301_3@
- System.out.print("<sex>"@H_301_3@);@H_301_3@@H_301_3@
- if@H_301_3@(@H_301_3@"age"@H_301_3@.equals(node.getNodeName())){@H_301_3@@H_301_3@
- System.out.print("<age>"@H_301_3@);@H_301_3@@H_301_3@
- if@H_301_3@(@H_301_3@"email"@H_301_3@.equals(node.getNodeName())){@H_301_3@@H_301_3@
- System.out.print("<email>"@H_301_3@);@H_301_3@@H_301_3@
- System.out.println("解析完毕"@H_301_3@);@H_301_3@@H_301_3@
- *测试@H_301_3@@H_301_3@
- //为什么有类似于这样东西[#text:]@H_301_3@@H_301_3@@H_301_3@
- //原因是XML文件元素之间的空白字符也是一个元素,<employees></employees>包含的空白@H_301_3@@H_301_3@@H_301_3@
- DomDemodom=new@H_301_3@DomDemo();@H_301_3@@H_301_3@
- Filefile=new@H_301_3@File(@H_301_3@"E://dom.xml"@H_301_3@);@H_301_3@@H_301_3@
- dom.createXml(file);@H_301_3@
- dom.parserXml(file);@H_301_3@
- 四、SAX
1、原理:SAX类似流媒体,它基于事件驱动,当解析器发现元素开始、元素结束、文本、文档的开始或结束 等时,发送事件,程序员编写响应这些事件的代码,保存数据。无需将整个文档载入内存,使用者 只需要监听自己感兴趣的事件即可。@H_301_3@
2、优点:a、无需将整个xml文档载入内存,因此消耗内存少@H_301_3@
b、SAX解析器代码比DOM解析器代码小,适于Applet,下载。@H_301_3@
c、可以注册多个ContentHandler@H_301_3@
3、缺点:a、不能随机的访问xml中的节点@H_301_3@
b、只支持读,不能修改文档。非持久,事件过后,若没保存数据,那么数据就丢了@H_301_3@
c、无状态性;从事件中只能得到文本,但不知该文本属于哪个元素@H_301_3@
4、场合:大型xml文档;Applet;只需XML文档的少量内容,很少回头访问;@H_301_3@
?
import@H_301_3@javax.xml.parsers.SAXParser;@H_301_3@@H_301_3@
- import@H_301_3@javax.xml.parsers.SAXParserFactory;@H_301_3@@H_301_3@
- import@H_301_3@org.xml.sax.Attributes;@H_301_3@@H_301_3@
- import@H_301_3@org.xml.sax.helpers.DefaultHandler;@H_301_3@@H_301_3@
- *startDocument(),endDocument(),startElement(),endElement(),characters()@H_301_3@@H_301_3@
- public@H_301_3@@H_301_3@class@H_301_3@SAXParseDemo@H_301_3@extends@H_301_3@DefaultHandler{@H_301_3@@H_301_3@
- private@H_301_3@StringtagValue;@H_301_3@
- //开始解析XML文件@H_301_3@@H_301_3@@H_301_3@
- public@H_301_3@@H_301_3@void@H_301_3@startDocument()@H_301_3@throws@H_301_3@SAXException{@H_301_3@@H_301_3@
- System.out.println("开始解析"@H_301_3@);@H_301_3@@H_301_3@
- //结束解析XML文件@H_301_3@@H_301_3@@H_301_3@
- public@H_301_3@@H_301_3@void@H_301_3@endDocument()@H_301_3@throws@H_301_3@SAXException{@H_301_3@@H_301_3@
- System.out.println("结束解析"@H_301_3@);@H_301_3@@H_301_3@
- //解析元素@H_301_3@@H_301_3@@H_301_3@
- *开始解析一个元素@H_301_3@@H_301_3@
- *@paramqName标签名@H_301_3@@H_301_3@
- *@paramattributes属性@H_301_3@@H_301_3@
- @Override@H_301_3@@H_301_3@@H_301_3@
- public@H_301_3@@H_301_3@void@H_301_3@startElement(Stringuri,StringlocalName,StringqName,Attributesattributes)@H_301_3@@H_301_3@
- throws@H_301_3@SAXException{@H_301_3@@H_301_3@
- System.out.println(qName+"开始"@H_301_3@);@H_301_3@@H_301_3@
- //属性@H_301_3@@H_301_3@@H_301_3@
- if@H_301_3@(attributes!=@H_301_3@null@H_301_3@&&attributes.getLength()!=@H_301_3@0@H_301_3@){@H_301_3@@H_301_3@
- System.out.println("属性:"@H_301_3@);@H_301_3@@H_301_3@
- 0@H_301_3@;i<attributes.getLength();i++){@H_301_3@@H_301_3@
- System.out.print(attributes.getQName(i)+"="@H_301_3@);@H_301_3@
- System.out.print(attributes.getValue(i)+""@H_301_3@);@H_301_3@
- System.out.println();@H_301_3@
- *结束一个元素的解析遇到结束标签时调用此方法通常在此方法对标签取值并处理@H_301_3@@H_301_3@
- public@H_301_3@@H_301_3@void@H_301_3@endElement(Stringuri,StringqName)@H_301_3@throws@H_301_3@SAXException{@H_301_3@@H_301_3@
- System.out.println(qName+"标签值:"@H_301_3@+tagValue);@H_301_3@@H_301_3@
- System.out.println(qName+"结束"@H_301_3@);@H_301_3@@H_301_3@
- //所有xml文件中的字符都会放到ch[]中@H_301_3@@H_301_3@@H_301_3@
- public@H_301_3@@H_301_3@void@H_301_3@characters(@H_301_3@char@H_301_3@ch[],@H_301_3@int@H_301_3@start,@H_301_3@int@H_301_3@length)@H_301_3@throws@H_301_3@SAXException{@H_301_3@@H_301_3@
- tagValue=new@H_301_3@String(ch,start,length).trim();@H_301_3@@H_301_3@
- Filefile=new@H_301_3@File(@H_301_3@"src/cn/main/example/demo.xml"@H_301_3@);@H_301_3@@H_301_3@
- SAXParserFactorysaxParFac=SAXParserFactory.newInstance();@H_301_3@
- SAXParsersaxParser=saxParFac.newSAXParser();@H_301_3@
- saxParser.parse(file,new@H_301_3@SAXParseDemo());@H_301_3@@H_301_3@
- }catch@H_301_3@(Exceptione){@H_301_3@@H_301_3@
- }@H_301_3@
五、资料(关于Xpath)
1、选取节点
XPath 使用路径表达式在 XML 文档中选取节点,节点是沿着路径或者 step 来选取的。
常见的路径表达式:
表达式@H_301_3@ |
描述@H_301_3@ |
nodename |
选取当前节点的所有子节点 |
/ |
从根节点选取 |
// |
从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置 |
. |
选取当前节点 |
.. |
选取当前节点的父节点 |
@ |
选取属性 |
实例
路径表达式@H_301_3@
结果@H_301_3@ |
bookstore |
选取 bookstore 元素的所有子节点 |
/bookstore |
选取根元素 bookstore |
bookstore/book |
选取bookstore 下名字为 book的所有子元素@H_301_3@。 |
//book |
选取所有 book 子元素,而不管它们在文档中的位置。 |
bookstore//book |
选取bookstore 下名字为 book的所有后代元素@H_301_3@,而不管它们位于 bookstore 之下的什么位置。 |
//@@H_301_3@lang |
选取所有名为 lang 的属性。 |
2、谓语(Predicates)
谓语用来查找某个特定的节点或者包含某个指定的值的节点。
谓语被嵌在方括号中。
实例
常见的谓语的一些路径表达式:
/bookstore/book[1]
选取属于 bookstore 子元素的第一个 book 元素。 |
/bookstore/book[last()] |
选取属于 bookstore 子元素的最后一个 book 元素。 |
/bookstore/book[last()-1] |
选取属于 bookstore 子元素的倒数第二个 book 元素。 |
/bookstore/book[position()<3] |
选取最前面@H_301_3@的两个属于 bookstore 元素的子元素的 book 元素。 |
//title[@lang] |
选取所有拥有名为 lang 的属性的 title 元素。 |
//title[@lang='eng'] |
选取所有 title 元素,要求这些元素拥有值为 eng 的 lang 属性。 |
/bookstore/book[price>35.00] |
选取所有 bookstore 元素的 book 元素,要求book元素的子元素 price 元素的值须大于 35.00。 |
/bookstore/book[price>35.00]/title |
选取所有 bookstore 元素中的 book 元素的 title 元素,要求book元素的子元素 price 元素的值须大于 35.00 |
3、选取未知节点
XPath 通配符可用来选取未知的 XML 元素。
通配符@H_301_3@
* |
匹配任何元素节点 |
@* |
匹配任何属性节点 |
node() |
匹配任何类型的节点 |
/bookstore/*
//* |
选取文档中的所有元素 |
//title[@*] |
选取所有带有属性的 title 元素。 |
4、选取若干路径
通过在路径表达式中使用“|@H_301_3@”运算符,您可以选取若干个路径。
路径表达式@H_301_3@ |
@H_462_5027@ 结果@H_301_3@
//book/title|@H_301_3@//book/price |
@H_462_5027@ 选取所有 book 元素的 title 和 price 元素。
//title|@H_301_3@//price |
@H_462_5027@ 选取所有文档中的 title 和 price 元素。
/bookstore/book/title|@H_301_3@//price |
@H_462_5027@ 选取所有属于 bookstore 元素的 book 元素的 title 元素,以及文档中所有的 price 元素。
5、XPath 轴
轴可定义某个相对于当前节点的节点集。
轴名称@H_301_3@
ancestor |
选取当前节点的所有先辈(父、祖父等) |
ancestor-or-self |
选取当前节点的所有先辈(父、祖父等)以及当前节点本身 |
attribute |
选取当前节点的所有属性 |
child |
选取当前节点的所有子元素。 |
descendant |
选取当前节点的所有后代元素(子、孙等)。 |
descendant-or-self |
选取当前节点的所有后代元素(子、孙等)以及当前节点本身。 |
following |
选取文档中当前节点的结束标签之后的所有节点。 |
namespace |
选取当前节点的所有命名空间节点 |
parent |
选取当前节点的父节点。 |
preceding |
选取文档中当前节点的开始标签之前的所有节点。 |
preceding-sibling |
选取当前节点之前的所有同级节点。 |
self |
选取当前节点。 |
6、路径
位置路径可以是绝对的,也可以是相对的。
绝对路径起始于正斜杠( / ),而相对路径不会这样。在两种情况中,位置路径均包括一个或多个步,每个步均被斜杠分割:
/step/step/...
step/step/...
每个步均根据当前节点集之中的节点来进行计算。
轴(axis):定义所选节点与当前节点之间的树关系
节点测试(node-test):识别某个轴内部的节点
零个或者更多谓语(predicate):更深入地提炼所选的节点集
步的语法@H_301_3@:轴名称::节点测试[谓语]@H_301_3@
例子@H_301_3@
child::book |
选取所有属于当前节点的子元素的 book 节点 |
attribute::lang |
选取当前节点的 lang 属性 |
child::* |
选取当前节点的所有子元素 |
attribute::* |
child::text() |
选取当前节点的所有文本子节点 |
child::node() |
descendant::book |
选取当前节点的所有 book 后代 |
ancestor::book |
选择当前节点的所有 book 先辈 |
ancestor-or-self::book |
选取当前节点的所有book先辈以及当前节点(假如此节点是book节点的话) |
child::*/child::price |
选取当前节点的所有 price 孙。 |
7、XPath 运算符
运算符@H_301_3@ |
描述@H_301_3@ |
实例@H_301_3@ |
返回值@H_301_3@ |
| |
计算两个节点集 |
//book | //cd |
返回所有带有 book 和 ck 元素的节点集 |
+ |
加法 |
6 + 4 |
10 |
- |
减法 |
6 - 4 |
2 |
* |
乘法 |
6 * 4 |
24 |
div |
除法 |
8 div 4 |
= |
等于 |
price=9.80 |
如果 price 是 9.80,则返回 true。 如果 price 是 9.90,则返回 fasle。 |
!= |
不等于 |
price!=9.80 |
如果 price 是 9.90,则返回 true。 如果 price 是 9.80,则返回 fasle。 |
< |
小于 |
price<9.80 |
如果 price 是 9.00,则返回 true。 如果 price 是 9.90,则返回 fasle。 |
<= |
小于或等于 |
price<=9.80 |
> |
大于 |
price>9.80 |
>= |
大于或等于 |
price>=9.80 |
如果 price 是 9.90,则返回 true。 如果 price 是 9.70,则返回 fasle。 |
or |
或 |
price=9.80 or price=9.70 |
如果 price 是 9.80,则返回 true。 如果 price 是 9.50,则返回 fasle。 |
and |
与 |
price>9.00 and price<9.90 |
如果 price 是 9.80,则返回 true。 如果 price 是 8.50,则返回 fasle。 |
mod |
计算除法的余数 |
5 mod 2 |
1 |
大部分源代码来源于:http://www.jb51.cc/article/p-poqlaaev-bdz.html
部分资料来源于:http://www.jb51.cc/article/p-gkrkxlnq-ck.html
Dom4j大部分资料来源于:http://www.jb51.cc/article/p-atlhkbmf-bhz.html
Xpath部分内容来源于:http://nemogu.iteye.com/blog/1305503