博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
DOM4J解析XML
阅读量:6159 次
发布时间:2019-06-21

本文共 7411 字,大约阅读时间需要 24 分钟。

Dom4j 是一个简单、灵活的开放源代码的库。 Dom4j 是由早期开发 JDOM 的人分离出来而后独立开发的。与 JDOM 不同的是, dom4j 使用接口和抽象基类,虽然 Dom4j 的 API 相对要复杂一些,但它提供了比 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

 

 

转载地址:http://heafa.baihongyu.com/

你可能感兴趣的文章
java
查看>>
Vue.js连接后台数据jsp页面  ̄▽ ̄
查看>>
关于程序的单元测试
查看>>
mysql内存优化
查看>>
都市求生日记第一篇
查看>>
Java集合---HashMap源码剖析
查看>>
SQL优化技巧
查看>>
thead 固定,tbody 超出滚动(附带改变滚动条样式)
查看>>
Dijkstra算法
查看>>
css 动画 和 响应式布局和兼容性
查看>>
csrf 跨站请求伪造相关以及django的中间件
查看>>
MySQL数据类型--与MySQL零距离接触2-11MySQL自动编号
查看>>
生日小助手源码运行的步骤
查看>>
Configuration python CGI in XAMPP in win-7
查看>>
bzoj 5006(洛谷 4547) [THUWC2017]Bipartite 随机二分图——期望DP
查看>>
CF 888E Maximum Subsequence——折半搜索
查看>>
欧几里德算法(辗转相除法)
查看>>
面试题1-----SVM和LR的异同
查看>>
MFC控件的SubclassDlgItem
查看>>
如何避免历史回退到登录页面
查看>>