• DOM4J解析XML


    Dom4j是一个简单、灵活的开放源代码的库。Dom4j是由早期开发JDOM的人分离出来而后独立开发的。与JDOM不同的是,dom4j使用接口和抽象基类,虽然Dom4jAPI相对要复杂一些,但它提供了比JDOM更好的灵活性。
    Dom4j是一个非常优秀的Java XML API,具有性能优异、功能强大和极易使用的特点。现在很多软件采用的Dom4j,例如Hibernate,包括sun公司自己的JAXM也用了Dom4j
    使用Dom4j开发,需下载dom4j相应的jar文件。
     
    lDOM4j中:
    获得Document对象的方式有三种:
     1.读取XML文件,获得document对象            

                       SAXReader reader = new SAXReader();
                  Document   document = reader.read(new File("input.xml"));

      2.解析XML形式的文本,得到document对象.

                       String text = "<members></members>";
                  Document document = DocumentHelper.parseText(text);

      3.主动创建document对象.

                      Document document = DocumentHelper.createDocument();
                 //创建根节点

                      Element root = document.addElement("members");

    节点对象:

      

    1.获取文档的根节点.

          Element root = document.getRootElement();

    2.取得某个节点的子节点.

      Element element=node.element(“书名");

    3.取得节点的文字

          String text=node.getText();

    4.取得某节点下所有名为“member”的子节点,并进行遍历.
     List nodes =
    rootElm.elements("member");
     
      for (
    Iterator it = nodes.iterator(); it.hasNext();) {
         Element elm = (Element)
    it.next();
        // do something
     }
    5.对某节点下的所有子节点进行遍历.
        for(Iterator it=root.elementIterator();it.hasNext();){
           Element
    element = (Element) it.next();
           // do something
        }

    6.在某节点下添加子节点.
    Element ageElm = newMemberElm.addElement("age");

    7.设置节点文字.
     
    element.setText("29");
    8.删除某节点.
    //
    childElm是待删除的节点,parentElm是其父节点

        parentElm.remove(childElm);

    9.添加一个CDATA节点.
    Element
    contentElm = infoElm.addElement("content");
    contentElm.addCDATA(diary.getContent());
     
    节点对象属性:
     
    1.取得某节点下的某属性
        
    Element root=document.getRootElement();    
        //
    属性名name

             Attribute attribute=root.attribute("size");

    2.取得属性的文字

        String text=attribute.getText();
    3.删除某属性
      Attribute attribute=root.attribute("size");
     
    root.remove(attribute);
    4.遍历某节点的所有属性
       
    Element root=document.getRootElement();    
       for(
    Iterator it=root.attributeIterator();it.hasNext();){
             Attribute
    attribute = (Attribute) it.next();
             String text=
    attribute.getText();
             
    System.out.println(text);
        }

     5.设置某节点的属性和文字.

       newMemberElm.addAttribute("name", "sitinspring");

     6.设置属性的文字

       Attribute attribute=root.attribute("name");
       
    attribute.setText("sitinspring");
    将文档写入XML文件:
      
    1.文档中全为英文,不设置编码,直接写入的形式.
     
    XMLWriter writer = new XMLWriter(new  FileWriter("output.xml"));
     
    writer.write(document);
     
    writer.close();

     2.文档中含有中文,设置编码格式写入的形式.

    OutputFormat format = OutputFormat.createPrettyPrint();
    //
    指定XML编码                  

         format.setEncoding("GBK");       
    XMLWriter writer = new XMLWriter(newFileWriter("output.xml"),format);
    writer.write(document);
    writer.close();

    字符串与XML的转换 :

      

    1.将字符串转化为XML
     

         String text = "<members> <member>sitinspring</member></members>";
    Document
    document = DocumentHelper.parseText(text);

    2.将文档或节点的XML转化为字符串.

         SAXReader reader = new SAXReader();
    Document  
    document = reader.read(new File("input.xml"));            
    Element root=
    document.getRootElement();    

                
    String
    docXmlText=document.asXML();

    String rootXmlText=root.asXML();
    Element
    memberElm=root.element("member");
    String
    memberXmlText=memberElm.asXML();

    首先需要导入这两个jar包:

    第一个是必须的,第二个是为后边使用XPath使用的。

    对XML文档的CRUD操作:

    package com.dom4j.cn;
    
    
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.OutputStreamWriter;
    import java.io.UnsupportedEncodingException;
    import java.util.List;
    
    import org.dom4j.Attribute;
    import org.dom4j.Document;
    import org.dom4j.DocumentException;
    import org.dom4j.DocumentHelper;
    import org.dom4j.Element;
    import org.dom4j.io.OutputFormat;
    import org.dom4j.io.SAXReader;
    import org.dom4j.io.XMLWriter;
    import org.junit.Test;
    
    
    public class Dom4JDemo {
    	
    	/*
    	 * 读取指定标签的内容,以及他的属性
    	 */
    	@Test
    	public void read1() throws DocumentException {
    		SAXReader reader = new SAXReader();
    		Document document = reader.read("src/book.xml");
    		Element root = document.getRootElement();
    		
    		Element book = (Element) root.elements("书").get(0);
    		String value = book.element("书名").getText();
    		System.out.println("标签内容:" + value);
    		Attribute attr = book.element("书名").attribute("name");
    		System.out.println("标签属性 : " + attr.getName() + " 属性内容 : " + attr.getText());
    	}
    	
    	/*
    	 * 在标签末尾添加标签
    	 */
    	@Test
    	public void add1() throws DocumentException, IOException {
    		SAXReader reader = new SAXReader();
    		Document document = reader.read("src/book.xml");
    		Element root = document.getRootElement();
    		
    		
    		Element book = root.element("书");
    		book.addElement("售价").setText("100005415");
    		
    		//利用Format解决乱码问题。 注意XMLWriter的第一个参数要使用字节流
    		//如果它使用字符流的话,那么一定要指定该字符流的码表与format的一致
    		OutputFormat format = OutputFormat.createPrettyPrint();
    		format.setEncoding("UTF-8");
    		XMLWriter writer = new XMLWriter(new FileOutputStream("src/book.xml"), format);
    		writer.write(document);
    		writer.close();
    		
    		/*
    		 * 字符流的形式
    		 */
    		/*OutputFormat format = OutputFormat.createPrettyPrint();
    		format.setEncoding("UTF-8");
    		XMLWriter writer = new XMLWriter(new OutputStreamWriter(new FileOutputStream("src/book.xml"),"UTF-8"), format);
    		writer.write(document);
    		writer.close();*/
    	}
    	/*
    	 * 在指定标签的后边添加标签
    	 */
    	@Test
    	public void add2() throws DocumentException, IOException {
    		SAXReader reader = new SAXReader();
    		Document document = reader.read("src/book.xml");
    		Element root = document.getRootElement();
    		
    		Element book = root.element("书");
    		List list = book.elements();
    		Element price = DocumentHelper.createElement("加价");
    		price.setText("500"); //设置新标签的内容
    		price.addAttribute("ok", "yes"); // 设置新标签的属性
    		list.add(2, price);
    		
    		OutputFormat format = OutputFormat.createPrettyPrint();
    		format.setEncoding("UTF-8");
    		XMLWriter writer = new XMLWriter(new FileOutputStream("src/book.xml"), format);
    		writer.write(document);
    	}
    	/*
    	 * 删除指定标签 或者 属性
    	 */
    	@Test
    	public void delete() throws DocumentException, IOException {
    		SAXReader reader = new SAXReader();
    		Document document = reader.read("src/book.xml");
    		Element root = document.getRootElement();
    		
    		//删除标签
    		/*Element price = root.element("书").element("售价");
    		price.getParent().remove(price);*/
    		
    		Element bookName = root.element("书").element("书名");
    		bookName.remove(bookName.attribute("name"));
    		
    		
    		OutputFormat format = OutputFormat.createPrettyPrint();
    		format.setEncoding("UTF-8");
    		XMLWriter writer = new XMLWriter(new FileOutputStream("src/book.xml"), format);
    		writer.write(document);
    	}
    	/*
    	 * 更新指定标签内容或者属性
    	 */
    	@Test
    	public void update() throws DocumentException, IOException {
    		SAXReader reader = new SAXReader();
    		Document document = reader.read("src/book.xml");
    		Element root = document.getRootElement();
    		
    		//更新标签内同
    //		root.element("书").element("书名").setText("欧亚");
    		//更新标签属性
    		root.element("书").element("书名").attribute("name").setText("qqqq");
    		
    		OutputFormat format = OutputFormat.createPrettyPrint();
    		format.setEncoding("UTF-8");
    		XMLWriter writer = new XMLWriter(new FileOutputStream("src/book.xml"), format);
    		writer.write(document);
    	}
    }
    

      

    XMLPath类似于正则有非常强大的功能来取标签, 这里简单模拟一个登陆判断用户名密码的。 可以查看API

    package com.dom4j.cn;
    
    import java.io.File;
    
    import org.dom4j.Document;
    import org.dom4j.DocumentException;
    import org.dom4j.Node;
    import org.dom4j.io.SAXReader;
    
    public class XMLPathDemo {
    
    	
    	public static void main(String[] args) throws DocumentException {
    		String username = "aa";
    		String password = "111";
    		
    		SAXReader reader = new SAXReader();
    		Document document = reader.read(new File("src/users.xml"));
    		Node node = document.selectSingleNode("//user[@username='"+username+"' and @password='"+password+"']");
    		
    		if (node == null) {
    			System.out.println("用户名密码错误");
    		} else {
    			System.out.println("登陆成功");
    		}
    	}
    
    }
    

      

     XPathAPI :http://pan.baidu.com/s/1i3zDpNv

    DOM4J jar包: http://pan.baidu.com/s/1sj6O5R3  http://pan.baidu.com/s/1c0Fw81a

  • 相关阅读:
    2019年书单
    JMeter报错:Address already in use : connect
    读书笔记——弗洛伊德《梦的解析》
    Python3学习之路~10.3 论事件驱动与异步IO
    Python3学习之路~10.2 协程、Greenlet、Gevent
    nmon使用问题汇总(不定期更新)
    ( VIJOS )VOJ 1049 送给圣诞夜的礼品 矩阵快速幂
    POJ3233 Matrix Power Series 矩阵乘法
    NYOJ 298 点的变换 矩阵乘法
    HDU 5834 Magic boy Bi Luo with his excited tree 树形dp
  • 原文地址:https://www.cnblogs.com/E-star/p/3495042.html
Copyright © 2020-2023  润新知