今日大纲

1、DOM技术对xml的增删操作

2、使用DOM技术完成联系人管理

3、SAX和StAX解析

4、DOM4J解析

5、XPATH介绍

1、DOM的增删操作

1.1、DOM的增加操作

  1. /*
  2. * 演示使用dom技术给xml中添加标签
  3. * <book>
  4. <name id="b001">SSH</name>
  5. <author>老于</author>
  6. <price>152</price>
  7. </book>
  8.  
  9. 首先要找到book标签的父标签,拿到books,就可以books标签下添加book标签。
  10. */
  11. @Test
  12. public void add() throws Exception{
  13. //获取解析工厂
  14. DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
  15. //获取解析器对象
  16. DocumentBuilder builder = dbf.newDocumentBuilder();
  17. //获取dom对象
  18. Document dom = builder.parse("book.xml");
  19.  
  20. //先创建book标签 <book></book>
  21. Element book = dom.createElement("book");
  22. //创建name标签
  23. Element name = dom.createElement("name");
  24. name.setAttribute("id", "b003"); // <name id="b003"></name>
  25. name.setTextContent("oracle技术"); // <name id="b003">oracle技术</name>
  26.  
  27. Element author = dom.createElement("author");
  28. author.setTextContent("老毕"); // <author>老毕</author>
  29.  
  30. Element price = dom.createElement("price");
  31. price.setTextContent("1.28"); // <price>1.28</price>
  32.  
  33. //把标签组合在一起
  34. book.appendChild(name);
  35. book.appendChild(author);
  36. book.appendChild(price);
  37.  
  38. Node books = dom.getElementsByTagName("books").item(0);
  39. books.appendChild(book);
  40.  
  41. //写出去
  42. TransformerFactory factory = TransformerFactory.newInstance();
  43. Transformer transformer = factory.newTransformer();
  44. transformer.transform(new DOMSource(dom), new StreamResult("book.xml"));
  45. }

1.2、DOM的删除操作

  1. /*
  2. * 删除xml中的指定标签
  3. * 首先要找到被删除的标签,再找到它的父标签,通过父标签删除当前这个标签
  4. * 删除完成之后一定要重新写到xml中
  5. */
  6. @Test
  7. public void delete() throws Exception{
  8. //获取解析工厂
  9. DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
  10. //获取解析器对象
  11. DocumentBuilder builder = dbf.newDocumentBuilder();
  12. //获取dom对象
  13. Document dom = builder.parse("book.xml");
  14. //获取所有的book标签
  15. NodeList nodeList = dom.getElementsByTagName("book");
  16. //获取最后一个book标签
  17. Node node = nodeList.item(nodeList.getLength()-1);
  18. //获取book标签的父标签,然后删除自己
  19. node.getParentNode().removeChild(node);
  20. //写出去
  21. TransformerFactory factory = TransformerFactory.newInstance();
  22. Transformer transformer = factory.newTransformer();
  23. transformer.transform(new DOMSource(dom), new StreamResult("book.xml"));
  24.  
  25. }

1.3、抽取公共方法

  1. /*
  2. * 这个类主要提供对dom 的基本公共操作
  3. * 获取dom对象
  4. * 保存dom对象
  5. * 工具类一般提供的方法都是静态的。
  6. */
  7. public class DOMUtils {
  8. private static Document dom;
  9. // 书写静态代码块,在这个工具类加载的时候,就把dom树创建完成
  10. static {
  11. try {
  12. // 获取解析工厂
  13. DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
  14. // 获取解析器对象
  15. DocumentBuilder builder = dbf.newDocumentBuilder();
  16. // 获取dom对象
  17. dom = builder.parse("book.xml");
  18. } catch (Exception e) {
  19. System.out.println("创建dom树失败");
  20. }
  21. }
  22. // 获取dom对象
  23. public static Document getDOM() {
  24. return dom;
  25. }
  26. // 保存dom对象到xml中
  27. public static void save() {
  28. try {
  29. // 写出去
  30. TransformerFactory factory = TransformerFactory.newInstance();
  31. Transformer transformer = factory.newTransformer();
  32. transformer.transform(new DOMSource(dom), new StreamResult(
  33. "book.xml"));
  34. } catch (Exception e) {
  35. System.out.println("保存失败");
  36. }
  37. }
  38. }

2、DOM的综合案例(联系人管理系统):

  1. 需求:
  2. 用户在运行程序的时候需要先登录或注册个人信息,注册完成之后,当前登录的用户才能去管理自己的联系人。
  3.  
  4. 开发和用户交互的程序时,需要开发2个模块:
  5. 1、用户登录或者注册的模块
  6. 2、用户用来管理自己的联系人模块。
  7. 联系人模块主要是对联系人的增删改查操作
  8.  
  9. 使用xml保存数据。就需要定义一层专门负责和xml交互。
  10. 而和用户交互的层中还需要访问和xml交互那一层

2.1、先准备存储数据的容器。这里采用xml。

  这个xml中要保存用户的信息同时还要保存联系人的信息。

  每个用户都需要维护自己的联系人。

  1. <contacts>
  2. <user username=”zhangsan” password=”1234”> user标签用户
  3. <contact>
  4. <name></name>
  5. <age></age>
  6. <tel></tel>
  7. <addr></addr>
  8. <sex></sex>
  9. </contact>
  10. <contact>
  11. <name></name>
  12. <age></age>
  13. <tel></tel>
  14. <addr></addr>
  15. <sex></sex>
  16. </contact>
  17. </user>
  18. <user username=”xxxx” password=”4321”>
  19. <contact>
  20. <name></name>
  21. <age></age>
  22. <tel></tel>
  23. <addr></addr>
  24. <sex></sex>
  25. </contact>
  26.  
  27. </uesr>
  28. </contacts>

2.2、包的创建

  

2.3、完成和用户交互的注册登录退出界面

  1. //用户显示用户的登录注册退出
  2. public void core(){
  3. while( true ){
  4. System.out.println("1.登录");
  5. System.out.println("2.注册");
  6. System.out.println("0.退出");
  7. //获取用户输入的操作类型
  8. String operator = getKeyInfo();
  9. //处理用户到底选择的登录 注册 退出
  10. switch( operator ){
  11. case "1":
  12. //处理登录的功能
  13. break;
  14. case "2":
  15. //处理注册的功能
  16. break;
  17. case "0":
  18. //处理退的功能
  19. System.out.println("谢谢使用,您已经退出此系统");
  20. return;
  21. default:
  22. System.out.println("操作类型错误");
  23. }
  24. }
  25. }

2.4、实现登录功能

  定义LoginAndRegiter 实现登录和注册

  登录的用户交互界面功能实现:

  1. //处理登录的方法
  2. public void login(){
  3. //System.out.println("登录");
  4. System.out.println("请输入用户名");
  5. String username = GetKeyInfo.getKeyInfo();
  6. System.out.println("请输入密码");
  7. String password = GetKeyInfo.getKeyInfo();
  8. //调用dao中的判断用户登录是否成功的方法
  9. boolean boo = ConatactDao.login(username, password);
  10. //判断是否登录成功
  11. if( boo == true ){
  12. System.out.println("登录成功");
  13. }else{
  14. System.out.println("用户名或者密码错误");
  15. }
  16. }

  登录的帐号和密码验证的功能:在dao层的ContactDao类中实现帐号和密码的验证功能

  1. //完成验证用户的登录是否成功
  2. public static boolean login( String name , String pwd ){
  3. //定义标记
  4. boolean flag = false;
  5. Document dom = DOMUtils.getDOM();
  6. NodeList list = dom.getElementsByTagName("user");
  7. //遍历获取到的所有user标签,然后获取其中的username和password属性
  8. for (int i = 0; i < list.getLength(); i++) {
  9. Element user = (Element) list.item(i);
  10. //获取xml中的用户名和密码
  11. String xml_username = user.getAttribute("username");
  12. String xml_password = user.getAttribute("password");
  13. //判断用户名和密码是否正确
  14. if( name.equals(xml_username) && pwd.equals(xml_password) ){
  15. flag = true;
  16. }
  17. }
  18. return flag;
  19. }

2.5、实现注册功能

  1. //和用户交互的注册代码
  2. //处理注册的方法
  3. public void register(){
  4. System.out.println("请输入注册名");
  5. String username = GetKeyInfo.getKeyInfo();
  6. System.out.println("请输入注册密码");
  7. String password = GetKeyInfo.getKeyInfo();
  8. //调用后台完成用户名的注册
  9. ConatactDao.register(username, password);
  10. }

  用户保存注册信息的dao层的代码

  1. //完成注册的功能
  2. public static void register(String username, String password) {
  3. Document dom = DOMUtils.getDOM();
  4. //创建user节点
  5. Element user = dom.createElement("user");
  6. user.setAttribute("username", username);
  7. user.setAttribute("password", password);//<user username="xxxx" password="yyyy"></user>
  8. //xml中的根节点 contacts,并把这个user节点添加在根上
  9. dom.getFirstChild().appendChild(user);
  10.  
  11. DOMUtils.save();
  12. }

2.6、实现登录成功后显示对联系人的操作界面

  在负责登录和注册类中完成登录成功之后的显示联系人的增删改查界面

  1. //显示当前联系人的CRUD
  2. private void showCRUDOperator() {
  3. while( true ){
  4. System.out.println("1.增加联系人信息");
  5. System.out.println("2.删除联系人信息");
  6. System.out.println("3.修改联系人信息");
  7. System.out.println("4.查询联系人信息");
  8. System.out.println("0.退出");
  9. String operator = GetKeyInfo.getKeyInfo();
  10. switch (operator) {
  11. case "1":
  12. //调用添加联系人的功能
  13. con.add();
  14. break;
  15. case "2":
  16. //调用删除联系人的功能
  17. con.delete();
  18. break;
  19. case "3":
  20. //调用修改联系人的功能
  21. con.update();
  22. break;
  23. case "4":
  24. //调用查询联系人的功能
  25. con.find();
  26. break;
  27. case "0":
  28. return;
  29. default:
  30. System.out.println("选择的操作类型错误");
  31. break;
  32. }
  33. }
  34. }

2.7、实现联系人的增加功能

  在登录注册类中的用于给用户显示联系人CURD功能中完成对ContactCRUD类中的增加联系人的操作

  1. //增加联系人
  2. public void add(){
  3. System.out.println("请输入联系人的姓名");
  4. String name = GetKeyInfo.getKeyInfo();
  5.  
  6. System.out.println("请输入联系人的年龄");
  7. String age = GetKeyInfo.getKeyInfo();
  8.  
  9. System.out.println("请输入联系人的电话");
  10. String tel = GetKeyInfo.getKeyInfo();
  11.  
  12. System.out.println("请输入联系人的住址");
  13. String addr = GetKeyInfo.getKeyInfo();
  14.  
  15. System.out.println("请输入联系人的性别");
  16. String sex = GetKeyInfo.getKeyInfo();
  17.  
  18. //创建一个联系人对象
  19. Contact c = new Contact();
  20. c.setAddr(addr);
  21. c.setAge(age);
  22. c.setSex(sex);
  23. c.setTel(tel);
  24. c.setName(name);
  25. //调用到层把当前的联系人的信息保存在当前登录成功的这个用户下面
  26. ConatactDao.addContact(c);
  27.  
  28. }

  在ContactDao中完成对联系人的增加操作

  1. //用于保存当前的联系人信息
  2. public static void addContact( Contact c ){
  3. //完成用户的的联系人的增加过程
  4. Document dom = DOMUtils.getDOM();
  5.  
  6. Element contact = dom.createElement("contact");
  7. contact.setAttribute("id", IDUtils.getID());
  8.  
  9. Element name = dom.createElement("name");
  10. name.setTextContent(c.getName());
  11.  
  12. Element age = dom.createElement("age");
  13. age.setTextContent(c.getAge());
  14.  
  15. Element tel = dom.createElement("tel");
  16. tel.setTextContent(c.getTel());
  17.  
  18. Element addr = dom.createElement("addr");
  19. addr.setTextContent(c.getAddr());
  20.  
  21. Element sex = dom.createElement("sex");
  22. sex.setTextContent(c.getSex());
  23.  
  24. contact.appendChild(name);
  25. contact.appendChild(age);
  26. contact.appendChild(tel);
  27. contact.appendChild(addr);
  28. contact.appendChild(sex);
  29.  
  30. currentUser.appendChild(contact);
  31.  
  32. DOMUtils.save();
  33.  
  34. }

2.8、实现联系人的删除功能

  ContactCRUD中的删除功能实现

  1. //删除联系人。根据联系人的姓名来删除
  2. public void delete(){
  3. System.out.println("请输入要删除的联系人姓名");
  4. String name = GetKeyInfo.getKeyInfo();
  5. boolean boo = ConatactDao.deleteByName(name);
  6. //判断是否删除成功
  7. if( boo ){
  8. System.out.println("删除成功");
  9. }else{
  10. System.out.println("删除失败");
  11. }
  12. }

  ContactDao中的删除功能

  1. /*
  2. * 删除联系人
  3. */
  4. public static boolean deleteByName(String name) {
  5. boolean flag = false;
  6. //使用当前登录的人来删除下面的指定名称的联系人
  7. NodeList list = currentUser.getElementsByTagName("contact");
  8. //遍历
  9. for (int i = 0; i < list.getLength(); i++) {
  10. //获取每个联系人的标签
  11. Element contact = (Element) list.item(i);
  12. //获取当前联系人的name标签中的文本值
  13. String xml_name = contact.getElementsByTagName("name").item(0).getTextContent();
  14. //判断
  15. if( name.equals(xml_name) ){
  16. flag = true;
  17. //删除当前的联系人
  18. currentUser.removeChild(contact);
  19. break;
  20. }
  21. }
  22. DOMUtils.save();
  23. return flag;
  24. }

2.9、实现联系人的修改功能

  修改功能的实现需要先查询有没有被修改的联系人,然后才能修改

  ContactCRUD中的修改功能实现

  1. //修改联系人
  2. public void update(){
  3. System.out.println("请输入要修改的联系人姓名");
  4. String name = GetKeyInfo.getKeyInfo();
  5. boolean boo = ConatactDao.findByName(name);
  6. //判断是否删除成功
  7. if( boo ){
  8. //让输入联系人的年龄 性别 电话 地址
  9. System.out.println("请输入修改的联系人的年龄");
  10. String age = GetKeyInfo.getKeyInfo();
  11.  
  12. System.out.println("请输入修改的联系人的电话");
  13. String tel = GetKeyInfo.getKeyInfo();
  14.  
  15. System.out.println("请输入修改的联系人的住址");
  16. String addr = GetKeyInfo.getKeyInfo();
  17.  
  18. System.out.println("请输入修改的联系人的性别");
  19. String sex = GetKeyInfo.getKeyInfo();
  20.  
  21. //创建一个联系人对象
  22. Contact c = new Contact();
  23. c.setAddr(addr);
  24. c.setAge(age);
  25. c.setSex(sex);
  26. c.setTel(tel);
  27. c.setName(name);
  28. ConatactDao.update(c);
  29. System.out.println("修改成功");
  30. }else{
  31. System.out.println("没有当前输入姓名的联系人");
  32. }
  33. }

  ContactDao中的代码分成2部分,第一部分查询被修改的人是否存在

  1. /*
  2. * 修改时查找有没有当前这个联系人
  3. */
  4. public static boolean findByName(String name) {
  5. boolean flag = false;
  6. // 使用当前登录的人来查询其中的符合条件的联系人信息
  7. NodeList list = currentUser.getElementsByTagName("contact");
  8. for (int i = 0; i < list.getLength(); i++) {
  9. Element contact = (Element) list.item(i);
  10. // 获取联系人的姓名
  11. String xml_name = contact.getElementsByTagName("name").item(0)
  12. .getTextContent();
  13. // 判断姓名是否相同
  14. if (name.equals(xml_name)) {
  15. flag = true;
  16. }
  17. }
  18. return flag;
  19. }

  ContactDao中的代码分成2部分,第二部分查询被修改练习人实现

  1. /*
  2. * 完成数据的修改
  3. */
  4. public static void update(Contact c) {
  5. // 使用当前登录的人来查询其中的符合条件的联系人信息
  6. NodeList list = currentUser.getElementsByTagName("contact");
  7. for (int i = 0; i < list.getLength(); i++) {
  8. Element contact = (Element) list.item(i);
  9. // 获取联系人的姓名
  10. String xml_name = contact.getElementsByTagName("name").item(0).getTextContent();
  11. // 判断姓名是否相同
  12. if (c.getName().equals(xml_name)) {
  13. contact.getElementsByTagName("age").item(0).setTextContent(c.getAge());
  14. contact.getElementsByTagName("tel").item(0).setTextContent(c.getTel());
  15. contact.getElementsByTagName("addr").item(0).setTextContent(c.getAddr());
  16. contact.getElementsByTagName("sex").item(0).setTextContent(c.getSex());
  17. break;
  18. }
  19. }
  20. DOMUtils.save();
  21. }

2.10、实现联系人的显示功能

  完成和用户交互的显示联系人

  1. //查询联系人
  2. public void find(){
  3. List<Contact> list = ConatactDao.findAll();
  4. for (Contact contact : list) {
  5. System.out.println(contact);
  6. }
  7. }

  在ContactDao类中完成查询联系人的信息

  1. /*
  2. * 提供查询所有联系人的功能
  3. */
  4. public static List<Contact> findAll(){
  5. List<Contact> list = new ArrayList<>();
  6. //获取dom
  7. //Document dom = DOMUtils.getDOM();
  8. NodeList contacts = currentUser.getElementsByTagName("contact");
  9. //遍历获取每个联系人的信息
  10. for (int i = 0; i < contacts.getLength(); i++) {
  11. //单独创建一个联系人对象,用来封装从xml中获取到的联系人信息
  12. Contact c = new Contact();
  13. //获取某个联系人的标签
  14. Element contact = (Element) contacts.item(i);
  15. //获取到联系人下的name标签
  16. Element name = (Element) contact.getElementsByTagName("name").item(0);
  17. c.setName(name.getTextContent());
  18.  
  19. //获取到联系人下的age标签
  20. Element age = (Element) contact.getElementsByTagName("age").item(0);
  21. c.setAge(age.getTextContent());
  22.  
  23. //获取到联系人下的tel标签
  24. Element tel = (Element) contact.getElementsByTagName("tel").item(0);
  25. c.setTel(tel.getTextContent());
  26.  
  27. //获取到联系人下的addr标签
  28. Element addr = (Element) contact.getElementsByTagName("addr").item(0);
  29. c.setAddr(addr.getTextContent());
  30.  
  31. //获取到联系人下的sex标签
  32. Element sex = (Element) contact.getElementsByTagName("sex").item(0);
  33. c.setSex(sex.getTextContent());
  34.  
  35. //把联系人添加到集合中
  36. list.add(c);
  37. }
  38. return list;
  39. }

3、SAX解析

  1. public class StAX {
  2. @Test
  3. public void read() throws Exception{
  4. //获取工厂
  5. XMLInputFactory factory = XMLInputFactory.newFactory();
  6. //获取解析器
  7. XMLEventReader reader = factory.createXMLEventReader(new FileInputStream("book.xml"));
  8. //使用循环开始读取数据
  9. while( reader.hasNext() ){
  10. XMLEvent event = reader.nextEvent();
  11. if(event.isStartElement()){
  12. //获取当前这个标签
  13. StartElement element = event.asStartElement();
  14. Attribute attr = element.getAttributeByName(new QName("id"));
  15. if( attr != null ){
  16. System.out.println("id="+attr.getValue());
  17. }
  18. //判断当前的标签名是否是name或者age
  19. if( element.getName().getLocalPart().equals("name") ){
  20. XMLEvent text = reader.nextEvent();
  21. System.out.println(text.asCharacters());
  22. }
  23. //判断当前的标签名是否是name或者age
  24. if( element.getName().getLocalPart().equals("age") ){
  25. XMLEvent text = reader.nextEvent();
  26. System.out.println(text.asCharacters());
  27. }
  28. }
  29. }
  30. }
  31. }

4、StAX解析

  1. public class SAXDemo {
  2. @Test
  3. public void read() throws Exception{
  4. //获取工厂
  5. SAXParserFactory factory = SAXParserFactory.newInstance();
  6. //获取解析器
  7. SAXParser parser = factory.newSAXParser();
  8. //给解析器传递xml和handler对象
  9. parser.parse("book.xml", new MyDefaultHandler() );
  10. }
  11. }
  12. //在handler中使用对应的方法来读取数据
  13. class MyDefaultHandler extends DefaultHandler{
  14. //记录当前读取到标签名称
  15. private String el = "";
  16.  
  17. public void startDocument() throws SAXException {
  18. System.out.println("文档开始了");
  19. }
  20. public void endDocument() throws SAXException {
  21. System.out.println("文档结束了");
  22. }
  23. public void startElement(String uri, String localName, String qName,
  24. Attributes attributes) throws SAXException {
  25. if( qName.equals("name") ){
  26. el = qName;
  27. System.out.print("name:id="+attributes.getValue("id")+"\t");
  28. }
  29. }
  30. public void endElement(String uri, String localName, String qName)
  31. throws SAXException {
  32. if( qName.equals("name") ){
  33. el="";
  34. }
  35. }
  36. public void characters(char[] ch, int start, int length)
  37. throws SAXException {
  38. if( !el.equals("") ){
  39. System.out.println(new String(ch,start,length));
  40. }
  41. }
  42. }

5、DOM4J解析

  1. /*
  2. * dom4j技术:
  3. * sun公司提供三种对xml的解析:
  4. * dom
  5. * sax
  6. * stax
  7. * jaxp jdk中提供好了这三种解析方案。
  8. * 在市面上也有第三方公司提供的xml解析。
  9. * dom4j dom for java 需要到第三方公司去下载对应的jar包程序。
  10. * www.dom4j.org 下载
  11. * 解压后,把dom4j-1.6.1.jar添加到当前自己项目的classpath中
  12. */
  13. public class DOMDemo {
  14. //解析一个xml文件
  15. public Document getDom() throws Exception{
  16. //获取解析器
  17. SAXReader reader = new SAXReader();
  18. Document dom = reader.read("book.xml");
  19. return dom;
  20. }
  21. /*
  22. * 读取xml文件中的内容
  23. */
  24. @Test
  25. public void read()throws Exception{
  26. Document dom = getDom();
  27.  
  28. //获取根节点
  29. Element root = dom.getRootElement();
  30. //System.out.println(root);
  31. //获取根节点下的所有直接子节点
  32. Iterator it = root.elementIterator();
  33. while( it.hasNext() ){
  34. Element el = (Element) it.next();
  35. String name = el.getName();
  36. String id = el.attribute("id").getValue();
  37. String text = el.getText();
  38. System.out.println(name+",id="+id+",text="+text);
  39. }
  40. }
  41. /*
  42. * 使用dom4j给xml中添加标签
  43. * <book id="b002" name="xxxx">
  44. <name>JavaEE</name>
  45. <author>老于</author>
  46. <price>2.82</price>
  47. </book>
  48. */
  49. @Test
  50. public void add() throws Exception{
  51. //获取dom树
  52. Document dom = getDom();
  53. //获取 根节点
  54. Element root = dom.getRootElement();
  55. //创建book标签,并且已经添加到books上
  56. Element book = root.addElement("book");
  57. book.addAttribute("id", "b002").addAttribute("name", "xxxxx");
  58.  
  59. //给book标签下添加子标签
  60. book.addElement("name").addText("JavaEE");
  61. book.addElement("author").setText("老于");
  62. book.addElement("price").setText("2.82");
  63.  
  64. //保存
  65. //创建用于写出xml的对象,建议用字节流FileOutputStream,因为字符流要转码
  66. OutputFormat format = OutputFormat.createPrettyPrint();
  67. XMLWriter writer = new XMLWriter(new FileOutputStream("book.xml"),format);
  68. writer.write(dom);
  69. writer.close();
  70. }
  71.  
  72. @Test
  73. public void update()throws Exception{
  74. Document dom = getDom();
  75. //获取根节点
  76. Element root = dom.getRootElement();
  77. //Element el = root.element("book").element("name");
  78. List list = root.elements("book");
  79. Element lastBook = (Element) list.get(list.size()-1);
  80. lastBook.element("name").setText("oracle");
  81.  
  82. OutputFormat format = OutputFormat.createPrettyPrint();
  83. XMLWriter writer = new XMLWriter(new FileOutputStream("book.xml"),format);
  84. writer.write(dom);
  85. writer.close();
  86. }
  87. @Test
  88. public void delete()throws Exception{
  89. Document dom = getDom();
  90. //获取根节点
  91. Element root = dom.getRootElement();
  92.  
  93. Element fisrtBook = (Element) root.elements("book").get(0);
  94. root.remove(fisrtBook);
  95.  
  96. OutputFormat format = OutputFormat.createPrettyPrint();
  97. XMLWriter writer = new XMLWriter(new FileOutputStream("book.xml"),format);
  98. writer.write(dom);
  99. writer.close();
  100. }
  101. /*
  102. * 使用第三方jar包来开发程序时,如果报错,类找不到错误
  103. * 这时可能是在当前的jar文本中没有这个类,
  104. * 错误中的第二个单词,或者第三个单词就为这个类所在的jar包名
  105. *
  106. *
  107. * xpath语法:
  108. * 在使用dom4j解析xml文档的时候可以使用xpath技术快速定位到具体的标签上。
  109. * 以/ 开始 说明是从根开始找
  110. * 以// 开始 只要匹配就可以。
  111. *
  112. * /books 找根为books的标签
  113. * /books/name 找根books下紧跟的子标签name
  114. * /books//name books标签下的所有的name标签,那么不一定是它的直接子标签
  115. * /AAA/BBB[@id] aaa标签下的直接子标签bbb中含有id的标签全部被选中
  116. * /AAA/BBB[1] aaa标签下的第一个字节子标签bbb
  117. * xpath的功能是可以快速的定位到xml的某个标签上。
  118. */
  119. @Test
  120. public void find()throws Exception{
  121. Document dom = getDom();
  122. //获取根节点
  123. Element root = dom.getRootElement();
  124. String xpath = "/books/abc";
  125. List names = root.selectNodes(xpath);
  126. Element el = (Element) names.get(0);
  127. System.out.println(el.getText());
  128. }
  129. @Test
  130. public void select() throws Exception{
  131. // String path = "//user[fn:upper-case(@id)='XX'and fn:upper-case(@name)='"+name+"']";
  132. SAXReader reader = new SAXReader();
  133. Document dom = reader.read("contact.xml");
  134. Scanner s = new Scanner(System.in);
  135. String name = s.nextLine().toUpperCase();
  136. String pwd = s.nextLine().toUpperCase();
  137. //获取到根
  138. Element root = dom.getRootElement();
  139. String xpath = "//user[fn:upper-case(@username)='"+name+"' and fn:upper-case(@password)='"+pwd+"']";
  140. List list = root.selectNodes(xpath);
  141. if( list.size() == 0 ){
  142. System.out.println("用户名或者密码错误");
  143. }else{
  144. System.out.println("登录成功");
  145. }
  146. }
  147. }

DOM综合案例、SAX解析、StAX解析、DOM4J解析的更多相关文章

  1. JQuery:JQuery基本语法,JQuery选择器,JQuery DOM,综合案例 复选框,综合案例 随机图片

    知识点梳理 课堂讲义 1.JQuery快速入门 1.1.JQuery介绍 jQuery 是一个 JavaScript 库. 框架:Mybatis (jar包) 大工具 插件:PageHelper (j ...

  2. xml文件的解析(用dom4j解析)

    有个第三方的包,用来解析.xml文件比较方便,它是DOM4J.由于是第三方的,所以要使用它就要先下载,并包含进来.步骤: 1.打开dom4j官网,这里下载最新版dom4j-2.1.1.jar. 2.新 ...

  3. JavaEE实战——XML文档DOM、SAX、STAX解析方式详解

    原 JavaEE实战--XML文档DOM.SAX.STAX解析方式详解 2016年06月22日 23:10:35 李春春_ 阅读数:3445 标签: DOMSAXSTAXJAXPXML Pull 更多 ...

  4. XML的解析方式(DOM、SAX、StAX)

    (新)  XML的解析方式(DOM.SAX.StAX) 博客分类: XML   一般来说,解析XML文件存在着两种方式,一种是event-based API,比如说象SAX,XNI. 第二种是tree ...

  5. dom4j解析器 基于dom4j的xpath技术 简单工厂设计模式 分层结构设计思想 SAX解析器 DOM编程

    *1 dom4j解析器   1)CRUD的含义:CreateReadUpdateDelete增删查改   2)XML解析器有二类,分别是DOM和SAX(simple Api for xml).     ...

  6. DOM、SAX、JDOM、DOM4J四种XML解析方法PK

    基础方法(指不需要导入jar包,java自身提供的解析方式):DOM.SAXDOM:是一种平台无关的官方解析方式   --优点:          (1)形成了树结构,直观好理解,代码更易编写     ...

  7. 对DOM,SAX,JDOM,DOM4J四种方法解析XML文件的分析

    1.DOM 与平台无关的官方解析方式 DOM是一次性把xml文件加载到内存中,形成一个节点树 对内存有要求 2.SAX java提供的基于事件驱动的解析方式 每次遇到一个标签,会触发相应的事件方法 3 ...

  8. XML概念定义以及如何定义xml文件编写约束条件java解析xml DTD XML Schema JAXP java xml解析 dom4j 解析 xpath dom sax

    本文主要涉及:xml概念描述,xml的约束文件,dtd,xsd文件的定义使用,如何在xml中引用xsd文件,如何使用java解析xml,解析xml方式dom sax,dom4j解析xml文件 XML来 ...

  9. DOM、SAX、JDOM、DOM4J以及PULL在XML文件解析中的工作原理以及优缺点对比

    1. DOM(Document Object Model)文档对象模型1. DOM是W3C指定的一套规范标准,核心是按树形结构处理数据,DOM解析器读入XML文件并在内存中建立一个结构一模一样的&qu ...

随机推荐

  1. Install Sogou IM 2.0 in Ubuntu14.04+/Xfce

    Ubuntu14.04+ 安装搜狗输入法 搜狗输入法是一款非常友好的输入法产品,从Ubuntu14.04开始对Linux支持,不过只是Debian系的,是Ubuntu优麒麟组引入的.优麒麟是针对国人设 ...

  2. oracle 存储过程发邮件

    CREATE OR REPLACE PROCEDURE PROCSENDEMAIL(P_TXT       VARCHAR2,                                      ...

  3. PHP序列化以及反序列化系列[1]--PHP序列化格式的写法

    反序列化:对单一的已序列化的变量进行操作,将其转换回 PHP 的值(zval). PHP序列化方式 PHP在序列化的时候会将相应的变量以对应的键值进行储存. 将一个类序列化的话,处理代码主要的 文件: ...

  4. PHP的一些常用汇总

    1. 使用strcmp()函数[区分大小写] 和strcasecmp()函数按照字节比较.比较结果显示:前和后相同为0,前>后为大于0,前<后为小于0. 2. 格式化字符串:number_ ...

  5. 【PHP设计模式 02_JieKou.php】面向接口开发

    <?php /** * [面向接口开发] * */ header("Content-type: text/html; charset=utf-8"); /*共同接口--连接数 ...

  6. vs 常见问题汇总

    vs添加对dll的引用 我们在使用vs进行开发调试的时候经常会遇到一个问题,就是当我们的主工程引用到其他工程更新的dll(我们经常采用copy到工程目录的方法).亦或者当我们的多个工程引用到同一个dl ...

  7. js笔记---拖动元素

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...

  8. 过滤器(Filter)案例:检测用户是否登陆的过滤器

    *****检测用户是否登陆的过滤器:不需要用户跳转到每个页面都需要登陆,访问一群页面时,只在某个页面上登陆一次,就可以访问其他页面: 1.自定义抽象的 HttpFilter类, 实现自 Filter ...

  9. 周赛-Colored Sticks 分类: 比赛 2015-08-02 09:33 7人阅读 评论(0) 收藏

    Colored Sticks Time Limit: 5000MS Memory Limit: 128000K Total Submissions: 32423 Accepted: 8556 Desc ...

  10. 山东理工大学第七届ACM校赛-飞花的鱼塘 分类: 比赛 2015-06-26 10:30 43人阅读 评论(0) 收藏

    飞花的鱼塘 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 一日,飞花壕在稷下湖游玩,忽然,飞花巨有了一个养鱼的想法,于是,他大手 ...