使用DOM4J解析XML文档,以及使用XPath提取XML文档

使用DOM4J解析XML文档

需要首先下载DOM4J工具包。这是个第三方工具包

在使用DOM4J解析的时候需要导入 DOM4J的JAR包

下载DOM4J工具包-》在MyEclipse中新建lib文件夹-》在DOM4J中导入JAR包。可以全部导入,也可以导入指定的JAR包,这里我只导入dom4j 的jar包,.–》 右键点击dom4j的jar -》 Build Path -> add to Build Path -> 看见变成奶瓶后就导入成功了

 

 

进行增删改查

 

 

文档为:

 

 

[html][/html] view plaincopyprint?

  1. <?xml version=”1.0″ encoding=”UTF-8″?>
  2. <书架>
  3.   <书>
  4.     <书名 name=”xxxxx”>第一本书</书名>
  5.     <作者>六道01</作者>
  6.     <售价>100</售价>
  7.   </书>
  8.   <书>
  9.     <书名>第二本书</书名>
  10.     <作者>六道02</作者>
  11.     <售价>200</售价>
  12.   </书>
  13. </书架>

 

 

程序为:

 

 

[java][/java] view plaincopyprint?

  1. import java.io.File;
  2. import java.io.FileNotFoundException;
  3. import java.io.FileOutputStream;
  4. import java.io.IOException;
  5. import java.io.UnsupportedEncodingException;
  6. import java.util.List;
  7. import org.dom4j.Document;
  8. import org.dom4j.DocumentException;
  9. import org.dom4j.DocumentHelper;
  10. import org.dom4j.Element;
  11. import org.dom4j.io.OutputFormat;
  12. import org.dom4j.io.SAXReader;
  13. import org.dom4j.io.XMLWriter;
  14. import org.junit.Test;
  15. //使用dom4j解析XML文档
  16. public class Demo1
  17. {
  18.     // 读取XML第二本书的: <书名>第二本书</书名>
  19.     // 读取!!
  20.     @Test
  21.     public void read() throws Exception
  22.     {
  23.         // 获得document
  24.         SAXReader reader = new SAXReader();
  25.         Document document = reader.read(new File(“src/MyBook.xml”));
  26.         // 获得根节点
  27.         Element root = document.getRootElement();
  28.         // 通过elements获得 素有包含书的标签的 文档,并再获得第二个标签的书 get(1);
  29.         // 需要强转 因为通过elements获得的是list集合 里面是object 类型
  30.         Element book = (Element) root.elements(“书”).get(1);
  31.         // 获得书里面的内容
  32.         String value = book.element(“书名”).getText();
  33.         System.out.println(value);
  34.         // 获得里面的属性的值
  35.         // 第一本书才有属性 所以get(0)
  36.         Element book2 = (Element) root.elements(“书”).get(0);
  37.         // 获得书里面的内容
  38.         String value2 = book2.element(“书名”).attribute(“name”).getValue();
  39.         System.out.println(value2);
  40.     }
  41.     // 写入
  42.     // 在第一本书上添加一个新的售价 :<售价> 250元 </售价>
  43.     // 写入的时候注意编码的问题 默认使用GB2312
  44.     @Test
  45.     public void add() throws DocumentException, IOException,
  46.             FileNotFoundException
  47.     {
  48.         // 获得document
  49.         SAXReader reader = new SAXReader();
  50.         Document document = reader.read(new File(“src/MyBook.xml”));
  51.         Element book = document.getRootElement().element(“书”);
  52.         book.addElement(“售价”).setText(“250元”);
  53.         // 格式化输入器。 createPrettyPrint创建漂亮的格式化输入器
  54.         OutputFormat format = OutputFormat.createPrettyPrint();
  55.         // 文档是什么类型格式化输入器就是什么类型
  56.         format.setEncoding(“UTF-8”);
  57.         // 更新XML文档 ,将内存中数据写入XML文档当中去
  58.         // 这里用的是字节流,用字符流的话不会查码表,如果写入和输出的编码不一样则会乱码
  59.         // 用字节流会查自己提供的码表。
  60.         XMLWriter writer = new XMLWriter(
  61.                 new FileOutputStream(“src/MyBook.xml”), format);
  62.         // 开始写入
  63.         writer.write(document);
  64.         writer.close();
  65.     }
  66.     // 在一本书的指定的位置添加售价:<售价> 350元 </售价>  只要更改保存了所有孩子的list集合的顺序
  67.     @Test
  68.     public void add2() throws DocumentException, IOException,
  69.             FileNotFoundException
  70.     {
  71.         // 获得document
  72.         SAXReader reader = new SAXReader();
  73.         Document document = reader.read(new File(“src/MyBook.xml”));
  74.         // 得到书的标签
  75.         Element book = document.getRootElement().element(“书”);
  76.         // 将获得的书的标签存入 list集合
  77.         // list集合中的集合的样子是:[书名,作者,售价] 现在在售价前面添加售价
  78.         List list = book.elements();
  79.         // 获得售价
  80.         Element price = DocumentHelper.createElement(“售价”);
  81.         // 设置售价内容
  82.         price.setText(“350元”);
  83.         // 第二个[书名,作者,售价,售价]
  84.         list.add(2, price);
  85.         // 将内存中document写入xml文档
  86.         OutputFormat format = OutputFormat.createPrettyPrint();
  87.         format.setEncoding(“UTF-8”);
  88.         XMLWriter writer = new XMLWriter(
  89.                 new FileOutputStream(“src/MyBook.xml”), format);
  90.         // 开始写入
  91.         writer.write(document);
  92.         writer.close();
  93.     }
  94.     //删除 上面add2添加的售价节点
  95.     @Test
  96.     public void delete() throws DocumentException, Exception
  97.     {
  98.         SAXReader reader = new SAXReader();
  99.         Document document = reader.read(new File(“src/MyBook.xml”));
  100.         //获得售价标签
  101.         Element price = document.getRootElement().element(“书”).element(“售价”);
  102.         //删除售价
  103.         price.getParent().remove(price);
  104.         //更新XML文档
  105.         OutputFormat format = OutputFormat.createPrettyPrint();
  106.         format.setEncoding(“UTF-8”);
  107.         XMLWriter writer = new XMLWriter(
  108.                 new FileOutputStream(“src/MyBook.xml”), format);
  109.         // 开始写入
  110.         writer.write(document);
  111.         writer.close();
  112.     }
  113.     //更新数据 改变第二本书的作者
  114.     @Test
  115.     public void updata() throws Exception
  116.     {
  117.         SAXReader reader = new SAXReader();
  118.         Document document = reader.read(new File(“src/MyBook.xml”));
  119.         Element book = (Element) document.getRootElement().elements(“书”).get(1);
  120.         book.element(“作者”).setText(“六道03”);
  121.         //更新数据
  122.         OutputFormat format = OutputFormat.createPrettyPrint();
  123.         format.setEncoding(“UTF-8”);
  124.         XMLWriter writer = new XMLWriter(
  125.                 new FileOutputStream(“src/MyBook.xml”), format);
  126.         // 开始写入
  127.         writer.write(document);
  128.         writer.close();
  129.     }
  130. }

 

 

 

****************************************************************************邪恶的分割***********************************************************************************************

 

 

下面使用XPath提取XML文档

需求:在XML文档中有用户名密码,现在编程定义用户名密码 ,测试用户名密码是否匹配,如果存在并匹配,那么打印登陆成功,如果不匹配,那么打印登陆失败。

 

xml文档:

 

 

[html][/html] view plaincopyprint?

  1. <?xml version=”1.0″ encoding=”UTF-8″?>
  2. <users>
  3.     <user id = “1” username = “aaa” password = “123” email=”123@sina.com”/>
  4.     <user id = “2” username = “bbb” password = “456” email=”456@sina.com”/>
  5. </users>

 

 

程序:

 

[java][/java] view plaincopyprint?

  1. import java.io.File;
  2. import org.dom4j.Document;
  3. import org.dom4j.DocumentException;
  4. import org.dom4j.Node;
  5. import org.dom4j.io.SAXReader;
  6. public class FindUsers
  7. {
  8.     /**
  9.      * 查找users.xml文档是否有和用户匹配的用户名和密码
  10.      *
  11.      * @param args
  12.      * @throws Exception
  13.      */
  14.     public static void main(String[] args) throws Exception
  15.     {
  16.         String username = “aaa”;
  17.         String password = “123”;
  18.         // 检测xml文档中是否有匹配的
  19.         SAXReader reader = new SAXReader();
  20.         Document document = reader.read(new File(“src/users.xml”));
  21.         // 使用XPath解析XML文档, 查找用户名和密码是否相匹配
  22.         //注意在这里 等于用户名和密码时 用到单引号
  23.         Node node = document.selectSingleNode(“//user[@username = ‘” + username
  24.                 + “‘ and @password = ‘” + password + “‘ ]”);
  25.         if(node==null)
  26.         {
  27.             System.out.println(“用户名或密码错误”);
  28.         }
  29.         else
  30.         {
  31.             System.out.println(“恭喜登陆成功”);
  32.         }
  33.     }
  34. }

标签