xPath技术
问题:当使用dom4j查询比较深的层次结构的节点(标签,属性,文本),比较麻烦!!!
xPath作用
主要是用于快速获取所需的节点对象。
在dom4j中如何使用xPath技术
1、导入xPath支持jar包 。 jaxen-1.1-beta-6.jar
2、使用xpath方法
List<Node> selectNodes("xpath表达式"); 查询多个节点对象
Node selectSingleNode("xpath表达式"); 查询一个节点对象
xPath语法
/ 绝对路径 表示从xml的根位置开始或子元素(一个层次结构)
// 相对路径 表示不分任何层次结构的选择元素。
* 通配符 表示匹配所有元素
[] 条件 表示选择什么条件下的元素
@ 属性 表示选择属性节点
and 关系 表示条件的与关系(等价于&&)
text() 文本 表示选择文本内容
作业:
用户登录功能:
用户输入用户名和密码 -> 到“数据库”查询是否有对应的用户 ->
有: 则表示登录成功
没有: 则表示登录失败
用xml当做数据库
user.xml 用来存储用户的数据
import java.io.File; import java.io.FileOutputStream; import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.io.OutputFormat; import org.dom4j.io.SAXReader; import org.dom4j.io.XMLWriter; public class Demo2 { public static void main(String[] args) throws Exception{ // 需求: 删除id值为2的学生标签 Document doc = new SAXReader().read(new File("F:/a.xml")); //1.查询id为2的学生标签 //使用xpath技术 Element stuElem = (Element)doc.selectSingleNode("//Student[@id='2']"); //2.删除标签 stuElem.detach(); //3.写出xml文件 FileOutputStream out = new FileOutputStream("e:/student.xml"); OutputFormat format = OutputFormat.createPrettyPrint(); format.setEncoding("utf-8"); XMLWriter writer = new XMLWriter(out,format); writer.write(doc); writer.close(); } }
import java.io.File; import java.util.List; import org.dom4j.Document; import org.dom4j.Node; import org.dom4j.io.SAXReader; public class Demo3 { public static void main(String[] args) throws Exception { Document doc = new SAXReader().read(new File("./src/contact.xml")); String xpath = ""; /** * 1.绝对路径, 表示从xml的根位置开始或子元素(一个层次结构) */ xpath = "/contactList"; xpath = "/contactList/contact"; /** * 2.相对路径, 表示不分任何层次结构的选择元素。 */ xpath = "//contact/name"; xpath = "//name"; /** * 3. 通配符,表示匹配所有元素 */ xpath = "/contactList/*"; xpath = "/contactList//*"; /** * 4.条件,表示选择什么条件下的元素 */ //带有id属性的contact标签 xpath = "//contact[@id]"; //第二个的contact标签 xpath = "//contact[2]"; //选择最后一个contact标签 xpath = "//contact[last()]"; /** * 5.属性,表示选择属性节点 */ xpath = "//@id"; xpath = "//contact[not(@id)]"; xpath = "//contact[@id='002']"; xpath = "//contact[@id='001' and @name='eric']"; /** *6.表示选择文本内容 */ //选择name标签下的文本内容,返回Text对象 xpath = "//name/text()"; xpath = "//contact/name[text()='李杰']"; List<Node> list = doc.selectNodes(xpath); for (Node node : list) { System.out.println(node); } } }
//模拟登陆
import java.io.BufferedReader; import java.io.File; import java.io.InputStreamReader; import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.io.SAXReader; public class Demo4 { public static void main(String[] args)throws Exception{ //1.获取用户输入的用户名和密码 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); System.out.println("请输入用户名:"); String name = br.readLine(); System.out.println("请输入密码:"); String password = br.readLine(); //2.到“数据库”中查询是否有对应的用户 Document doc = new SAXReader().read(new File("./src/user.xml")); Element userElem = (Element)doc.selectSingleNode("//user[@name='" +name +"' and @password='"+password+"']"); if(userElem!=null){ System.out.println("登录成功"); }else{ System.out.println("登录失败"); } } }
import java.io.File; import java.util.Iterator; import java.util.List; import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.io.SAXReader; public class Demo5 { public static void main(String[] args) throws Exception{ Document doc = new SAXReader().read(new File("./src/personList.html")); //读取title标签 Element titleElem = (Element)doc.selectSingleNode("//title"); String title = titleElem.getText(); System.out.println(title); //1.读取出所有tbody中的tr标签 List<Element> list = (List<Element>)doc.selectNodes("//tbody/tr"); //2.遍历 for (Element elem : list) { String id = elem.selectSingleNode("td[1]").getText(); String name = ((Element)elem.elements().get(1)).getText(); String gender = ((Element)elem.elements().get(2)).getText(); String age = ((Element)elem.elements().get(3)).getText(); String address = ((Element)elem.elements().get(4)).getText(); String phone = ((Element)elem.elements().get(5)).getText(); System.out.println("编号:"+id+" 姓名:"+name+" 性别:"+gender+" 年龄:"+age+" 地址:"+address+" 电话:"+phone); } } }