`
lzkyo
  • 浏览: 468187 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

用dom4j读写xml

    博客分类:
  • Java
阅读更多

一、例子

Java代码 复制代码
  1. public class XMLUtils {   
  2.     /**  
  3.      * 生成xml文件  
  4.      * @param doc  
  5.      * @param fileName  
  6.      * @param encoding  
  7.      */  
  8.     public static void createXMLFile(Document doc,String fileName,String encoding){   
  9.         XMLWriter writer = null;   
  10.         try{   
  11.             if(StringUtils.isNotEmpty(encoding)){   
  12.                 OutputFormat format = OutputFormat.createPrettyPrint();   
  13.                 format.setEncoding(encoding);    // 指定XML编码           
  14.                 writer = new XMLWriter(new FileWriter(fileName),format);   
  15.             }else{   
  16.                 writer = new XMLWriter(new FileWriter(fileName));   
  17.             }   
  18.             writer.write(doc);   
  19.         }catch(IOException e){   
  20.             e.printStackTrace();   
  21.         }finally{   
  22.             try{   
  23.                 writer.close();   
  24.             }catch(IOException e){   
  25.                 e.printStackTrace();   
  26.             }   
  27.         }   
  28.     }   
  29.        
  30.     /**  
  31.      * 创建Document并返回根结点  
  32.      * @param root_label    根标签     
  33.      * @return  
  34.      */  
  35.     public static Document createDocument(String root_label){   
  36.         Document doc = DocumentHelper.createDocument();   
  37.         doc.setRootElement(doc.addElement(root_label));   
  38.         return doc;   
  39.     }   
  40.        
  41.     /**  
  42.      * 将字符串转化为XML  
  43.      * @param xml_string  
  44.      * @return  
  45.      */  
  46.     public static Document createDocumentFromXmlString(String xml_string){   
  47.         if(StringUtils.isEmpty(xml_string)){   
  48.             xml_string = "<students> <class>test</class> </students>";   
  49.         }   
  50.         Document document = null;   
  51.         try {   
  52.             document = DocumentHelper.parseText(xml_string);   
  53.         } catch (DocumentException e) {   
  54.             e.printStackTrace();   
  55.         }   
  56.         return  document;   
  57.     }   
  58.        
  59.     /**  
  60.      * 给结点加子结点  
  61.      * @param root       相对根  
  62.      * @param newNode    新结点  
  63.      * @param nodeId     结点Id  
  64.      * @param elements   结点元素  
  65.      */  
  66.     public static void addNodeElement(Element root,String newNode,String nodeId,Map elements){   
  67.         Element _newNode = root.addElement(newNode);   
  68.         _newNode.addAttribute("id", nodeId).addAttribute("no", nodeId);//设置属性   
  69.            
  70.         Iterator   it   =   elements.entrySet().iterator();        
  71.         while(it.hasNext()){//结点下的元素与值   
  72.               Map.Entry  entry = (Map.Entry)it.next();        
  73.               Object key = entry.getKey();        
  74.               Object value = entry.getValue();   
  75.               _newNode.addElement((String)key).setText((String)value);   
  76.         }   
  77.     }   
  78.        
  79.     /**  
  80.      * 将文档或节点的XML转化为字符串  
  81.      * @param filePath  
  82.      * @return  
  83.      */  
  84.     public static String readXMLAsString(String filePath){   
  85.          SAXReader reader = new SAXReader();   
  86.          Document document=null;   
  87.         try {   
  88.             document = reader.read(new File(filePath));   
  89.             //Element root=document.getRootElement();                   
  90.         } catch (DocumentException e) {   
  91.             e.printStackTrace();   
  92.         }           
  93.             return document.asXML();   
  94.     }   
  95.   
  96.     /**  
  97.      * 打印节点的所有子节点  
  98.      * @param element  
  99.      */  
  100.     public static void printAllChildNode(Element element){   
  101.         //循环当前节点属性   
  102.         Iterator attrs = element.attributeIterator();   
  103.         while(attrs.hasNext()){   
  104.             Attribute attr = (Attribute)attrs.next();   
  105.             System.out.println(attr.getName() + "=" + attr.getText());   
  106.         }   
  107.            
  108.         //循环其孩子元素节点   
  109.         Iterator elements = element.elementIterator();   
  110.         while(elements.hasNext()){   
  111.             Element ele = (Element)elements.next();   
  112.             if(ele.attribute("id") == null){   
  113.                 System.out.println(ele.getName() + "=" + ele.getText());   
  114.             }   
  115.                
  116.             //递归调用   
  117.             printAllChildNode(ele);   
  118.         }   
  119.     }   
  120.        
  121.     /***  
  122.      * 以xpath读取数据  
  123.      * @param filePath  
  124.      * @param xpath  
  125.      */  
  126.     public static void printElementsByXPath(String filePath,String xpath){   
  127.         SAXReader reader = new SAXReader();   
  128.            
  129.         try{   
  130.           Document  doc = reader.read(new File(filePath));   
  131.              
  132.           List properties=doc.selectNodes(xpath);   
  133.              
  134.           Iterator it=properties.iterator();   
  135.              
  136.           while(it.hasNext()){   
  137.             Element elm=(Element)it.next();          
  138.             System.out.println(elm.getText());   
  139.           }   
  140.              
  141.         }   
  142.         catch(Exception ex){   
  143.            ex.printStackTrace();   
  144.         }   
  145.     }   
  146.        
  147.     public static void main(String[] args){   
  148.         Map<String,String> elements = new HashMap<String,String>();   
  149.         elements.put("name""张三");   
  150.         elements.put("sex""男");   
  151.         elements.put("age""20");   
  152.         Document doc = XMLUtils.createDocumentFromXmlString("<students></students>");   
  153.         doc.getRootElement().addAttribute("year""2000");   
  154.            
  155.         XMLUtils.addNodeElement(doc.getRootElement(), "student""20090313001", elements);   
  156.            
  157.         elements.clear();   
  158.         elements.put("name""李四");   
  159.         elements.put("sex""男");   
  160.         elements.put("age""21");   
  161.         XMLUtils.addNodeElement(doc.getRootElement(), "student""20090313002", elements);   
  162.            
  163.         String filePath = "D:/test.xml";   
  164.         XMLUtils.createXMLFile(doc, filePath, "GBK");   
  165.            
  166.         //System.out.println(XMLUtils.readXMLAsString(filePath));   
  167.            
  168.         XMLUtils.printElementsByXPath(filePath, "/students/student[@id=\"20090313001\"]/name");   
  169.         XMLUtils.printAllChildNode(doc.getRootElement());   
  170.       }   
  171. }  
public class XMLUtils {
	/**
	 * 生成xml文件
	 * @param doc
	 * @param fileName
	 * @param encoding
	 */
	public static void createXMLFile(Document doc,String fileName,String encoding){
		XMLWriter writer = null;
		try{
			if(StringUtils.isNotEmpty(encoding)){
				OutputFormat format = OutputFormat.createPrettyPrint();
	            format.setEncoding(encoding);    // 指定XML编码        
	            writer = new XMLWriter(new FileWriter(fileName),format);
			}else{
				writer = new XMLWriter(new FileWriter(fileName));
			}
			writer.write(doc);
		}catch(IOException e){
			e.printStackTrace();
		}finally{
			try{
				writer.close();
			}catch(IOException e){
				e.printStackTrace();
			}
		}
	}
	
	/**
	 * 创建Document并返回根结点
	 * @param root_label    根标签   
	 * @return
	 */
	public static Document createDocument(String root_label){
		Document doc = DocumentHelper.createDocument();
		doc.setRootElement(doc.addElement(root_label));
		return doc;
	}
	
	/**
	 * 将字符串转化为XML
	 * @param xml_string
	 * @return
	 */
	public static Document createDocumentFromXmlString(String xml_string){
		if(StringUtils.isEmpty(xml_string)){
			xml_string = "<students> <class>test</class> </students>";
		}
		Document document = null;
		try {
			document = DocumentHelper.parseText(xml_string);
		} catch (DocumentException e) {
			e.printStackTrace();
		}
		return  document;
	}
	
	/**
	 * 给结点加子结点
	 * @param root       相对根
	 * @param newNode    新结点
	 * @param nodeId     结点Id
	 * @param elements   结点元素
	 */
	public static void addNodeElement(Element root,String newNode,String nodeId,Map elements){
		Element _newNode = root.addElement(newNode);
		_newNode.addAttribute("id", nodeId).addAttribute("no", nodeId);//设置属性
		
		Iterator   it   =   elements.entrySet().iterator();     
		while(it.hasNext()){//结点下的元素与值
			  Map.Entry  entry = (Map.Entry)it.next();     
			  Object key = entry.getKey();     
			  Object value = entry.getValue();
			  _newNode.addElement((String)key).setText((String)value);
		}
	}
	
	/**
	 * 将文档或节点的XML转化为字符串
	 * @param filePath
	 * @return
	 */
	public static String readXMLAsString(String filePath){
		 SAXReader reader = new SAXReader();
         Document document=null;
		try {
			document = reader.read(new File(filePath));
            //Element root=document.getRootElement();                
		} catch (DocumentException e) {
			e.printStackTrace();
		}        
			return document.asXML();
	}

	/**
	 * 打印节点的所有子节点
	 * @param element
	 */
	public static void printAllChildNode(Element element){
		//循环当前节点属性
		Iterator attrs = element.attributeIterator();
		while(attrs.hasNext()){
			Attribute attr = (Attribute)attrs.next();
			System.out.println(attr.getName() + "=" + attr.getText());
		}
		
		//循环其孩子元素节点
		Iterator elements = element.elementIterator();
		while(elements.hasNext()){
			Element ele = (Element)elements.next();
			if(ele.attribute("id") == null){
				System.out.println(ele.getName() + "=" + ele.getText());
			}
			
			//递归调用
			printAllChildNode(ele);
		}
	}
	
	/***
	 * 以xpath读取数据
	 * @param filePath
	 * @param xpath
	 */
	public static void printElementsByXPath(String filePath,String xpath){
	    SAXReader reader = new SAXReader();
	    
	    try{
	      Document  doc = reader.read(new File(filePath));
	      
	      List properties=doc.selectNodes(xpath);
	      
	      Iterator it=properties.iterator();
	      
	      while(it.hasNext()){
	        Element elm=(Element)it.next();       
	        System.out.println(elm.getText());
	      }
	      
	    }
	    catch(Exception ex){
	       ex.printStackTrace();
	    }
	}
	
	public static void main(String[] args){
		Map<String,String> elements = new HashMap<String,String>();
		elements.put("name", "张三");
		elements.put("sex", "男");
		elements.put("age", "20");
		Document doc = XMLUtils.createDocumentFromXmlString("<students></students>");
		doc.getRootElement().addAttribute("year", "2000");
		
		XMLUtils.addNodeElement(doc.getRootElement(), "student", "20090313001", elements);
		
		elements.clear();
		elements.put("name", "李四");
		elements.put("sex", "男");
		elements.put("age", "21");
		XMLUtils.addNodeElement(doc.getRootElement(), "student", "20090313002", elements);
		
		String filePath = "D:/test.xml";
		XMLUtils.createXMLFile(doc, filePath, "GBK");
		
		//System.out.println(XMLUtils.readXMLAsString(filePath));
		
		XMLUtils.printElementsByXPath(filePath, "/students/student[@id=\"20090313001\"]/name");
		XMLUtils.printAllChildNode(doc.getRootElement());
	  }
}



二、使用XPATH

Xml代码 复制代码
  1. <AAA>    
  2.           <BBB/>    
  3.           <CCC/>    
  4.           <BBB/>    
  5.           <BBB/>    
  6.           <DDD>    
  7.                <BBB/>    
  8.           </DDD>    
  9.           <CCC/>    
  10. </AAA>   
<AAA> 
          <BBB/> 
          <CCC/> 
          <BBB/> 
          <BBB/> 
          <DDD> 
               <BBB/> 
          </DDD> 
          <CCC/> 
</AAA> 


(1)如果它是以斜线“/”开始,它是描述请求元素的绝对路径。
范例结构:

  • 访问元素“AAA”---- “/AAA” 。
  • 访问元素“CCC” --- “/AAA/CCC”,访问根目录AAA下面的子节点CCC,本例会得到两个节点的集合。
  • 访问根节点AAA的子节点DDD的子节点BBB:“/AAA/DDD/BBB”。


(2)如果路径表达式以“//”开始,它会查找所有符合规则的元素
范例结构:

  • “//BBB”,选择所有的元素<BBB/>,本例中共有四处
  • “//DDD/BBB”,选择元素节点“DDD”下的子节点“BBB”,只要满足元素“BBB”为“DDD”的子元素,就会被选择,本例一处。


(3)“*”选择所有由前面路径定位的元素
范例:

  • “/AAA/*”表示选择根节点下所有的元素
  • “/*/CCC”选择有一个父元素的“CCC”元素,“/*/*/BBB”选择第三级的根节点下的所有的“BBB”元素
  • “//*”表示匹配所有的元素


(4)在方括号中的表达式可以进一步的指定元素,方括号中的数字表示被选择元素集合的位置,last()函数表示被选择元素集的最后一个元素

  • “/AAA/BBB[2]” 表示根节点下“BBB”元素集合的第二个元素
  • “/AAA/BBB[last()]” 表示根节点下“BBB”元素集合的最后一个元素


(5)“@”表示属性

Xml代码 复制代码
  1. <AAA>    
  2.           <BBB id = "b1"/>    
  3.           <BBB id = "b2"/>    
  4.           <BBB name = "bbb"/>    
  5.           <BBB/>    
  6. </AAA>   
<AAA> 
          <BBB id = "b1"/> 
          <BBB id = "b2"/> 
          <BBB name = "bbb"/> 
          <BBB/> 
</AAA> 

 

  • “//@id”表示所有的名为“id”属性
  • “//BBB[@id]”表示所有含有ID属性的BBB元素
  • “//BBB[@*]”表示含有属性的所有的BBB元素,本例中的<BBB/>不会被选择,其它三个被选中
  • “//BBB[not(@*)]”表示没有属性的元素,本例中<BBB/>被选中,其它的三个元素不被选择


(6)属性的值可以做为选择标准,函数“normalize-space”可以移掉头部和尾部的空格,或者用单个的空格替换

Xml代码 复制代码
  1. <AAA>    
  2.           <BBB id = "b1"/>    
  3.           <BBB name = " bbb "/>    
  4.           <BBB name = "bbb"/>    
  5. </AAA>   
<AAA> 
          <BBB id = "b1"/> 
          <BBB name = " bbb "/> 
          <BBB name = "bbb"/> 
</AAA> 

 

  • “//BBB[@id=’b1’]”:选择属性值为“b1”的元素“BBB”
  • “//BBB[@name=’bbb’]”:选择属性值为“bbb”的元素,注意由于每一个属性名为name的元素“BBB”,其值有空格,不会被选择。
  • “//BBB[normalize-space(@name)='bbb']”:选择名称为“name”的,其值为“bbb”,值前后可以有空格,本例则会选择两个“BBB”元素


(7)函数count(*):计算选择元素的个数

  • “//*[count(BBB)=2]”,选中含两个“BBB”子元素的元素
  • “//*[count(*)=2]”,选中含有两个子元素的元素
分享到:
评论

相关推荐

    dom4j读写xml文档实例

    要使用DOM4J读取XML文档,首先需要创建一个`SAXReader`对象,然后调用`read`方法传入XML文件路径。这将返回一个`Document`对象,我们可以从中获取所有元素信息。 ```java File file = new File("path_to_xml_file")...

    读写超大类xml文件,使用dom4j读写xml文件的工具类

    基于dom4j的读写xml文件的工具包。封装了dom4j操作xml文档的常和方法。 支持两种读写方法。1:针对小文件的读取整个文档,2:针对大文件的,逐行读取。读到几百M文件毫无压力。

    使用dom4j对xml的读写

    **使用DOM4J对XML的读写** DOM4J是一个非常强大的Java库,专门用于处理XML文档。它提供了丰富的API,使得XML的读取、创建、修改和解析变得简单易行。相较于JDOM,DOM4J确实提供了更多的功能,虽然在学习曲线方面...

    Dom4j下载及使用Dom4j读写XML简介

    Dom4j解析教程。详细讲解如何使用dom4j解析xml,简单易懂。

    dom4j解析xml详解

    DOM4J的核心优势之一在于其丰富的接口体系,这些接口定义在`org.dom4j`包内,提供了对XML文档进行读写、查询、修改等操作的能力。 1. **Attribute**: 代表XML中的属性,可用于获取和设置属性值。 2. **Branch**: ...

    使用DOM4J对XML文件操作-添加、修改、删除、获取元素节点

    在本教程中,我们将深入探讨如何使用DOM4J来执行基本的XML操作,包括添加元素、修改元素、删除元素以及获取元素节点。 1. **添加元素节点** 在DOM4J中,添加元素节点通常涉及创建一个新的`Element`对象,然后将其...

    Dom4J生成XML的完整方法希望大家能用到

    ### Dom4J生成XML的完整方法详解 在Java开发领域,处理XML文档是常见的需求之一。Dom4J作为一款优秀的Java XML API,...掌握以上知识点,开发者即可熟练运用Dom4J生成复杂的XML文档,满足项目中对XML数据处理的需求。

    java中dom4j读写XML

    在提供的压缩包中,可能包含了dom4j的jar文件,解压后将其引入项目,就可以开始使用DOM4J进行XML操作了。 DOM4J不仅提供了基本的XML操作,还支持命名空间、事件处理、DTD和XML Schema验证等功能,是Java开发中处理...

    使用dom4j读写XML文档

    ### 使用dom4j读写XML文档的关键知识点 #### 一、简介与安装 - **DOM4J** 是一款用于处理XML文档的Java库,它提供了简单且强大的API来解析、创建、修改XML文档。 - 官方网站:[http://www.dom4j.org/]...

    dom4j解析xml文件的压缩包

    6. **Namespace支持**:DOM4J提供了对XML命名空间的全面支持,可以方便地处理包含命名空间的XML文档。 7. **DocumentType支持**:对于包含DOCTYPE声明的XML文档,DOM4J可以处理这些声明,并提供对应的DocumentType...

    dom4j解析xml文件(增删改查)

    在提供的视频资源"17-dom4j解析xml文档(增删改查).avi"中,可能详细展示了这些操作的步骤和示例,观看该视频将进一步加深你对DOM4J操作XML的理解。记得实践是检验理论的最好方式,动手操作会让你更好地掌握这些知识...

    dom4j_XML.rar_DOM4J_dom4j xml java_java xml_读写xml

    例子比较简单”的描述中,我们可以推断出这个压缩包包含了一些关于如何使用DOM4J进行XML读写的基本示例。以下是对这些关键知识点的详细解释: 1. **XML解析**:DOM4J支持两种解析XML文档的方式:SAX(Simple API ...

    XSD使用dom4j校验XML

    本篇文章将深入探讨如何利用DOM4J库来实现XSD对XML文档的校验,以确保XML文件符合预先设定的数据结构规则。 首先,理解XSD的作用至关重要。XSD文件定义了XML文档的元素、属性、数据类型以及它们之间的关系。通过...

    用dom4j对xml进行增删改查操作参考资料

    在提供的资源中,"dom4j读写XML及保存批量数据对象 - 五月天的博客 - ITeye技术网站.bmp"可能是一个教程页面的截图,它会详细解释这些操作的实现步骤。如果你遇到任何问题,可以参考这个截图或者在ITeye技术网站上...

    dom4j解析xml

    ### DOM4J解析XML知识点详解 ...通过结合使用DOM4J的基本类和XPath表达式,可以轻松地实现对XML文档的查询和修改。无论是对于开发人员还是对于那些需要频繁处理XML数据的应用程序来说,DOM4J都是一个非常有价值的工具。

    dom4j读写xml文件

    1. **解析XML文件**:使用DOM4J的`DocumentHelper`类的`parseText()`或`parse()`方法,可以将XML文件加载为一个`Document`对象。例如: ```java Document document = DocumentHelper.parseText(xmlString); ``` ...

    使用dom4j操作xml

    ### 使用dom4j操作XML详解 #### 一、DOM4j简介与配置 **DOM4j** 是一款专为Java平台设计的开源XML解析处理工具。它的设计充分考虑了性能和易用性,同时提供了对DOM、SAX及JAXP等标准的支持,因此非常适合进行复杂...

    dom4j解析XML所需jar包

    在使用DOM4J时,通常还需要依赖其他库来增强其功能。例如,`jaxen-1.1.1.jar`是DOM4J的一个依赖,它提供了XPath引擎,使得DOM4J能够执行XPath查询。Jaxen可以与多种XML解析器(如DOM、DOM4J、JDOM等)协同工作,提供...

    DOM4J jar包 xml解析 所有的dom4j-1.6.1 dom4j-2.0.2 dom4j-2.1.1包 导入直接使用

    DOM4J的名字来源于“Document Object Model for Java”,它采用面向对象的设计思想,提供了对XML文档的全面支持。 DOM4J库的核心功能包括: 1. **解析XML**:DOM4J可以读取XML文件,将其转换为一个树形结构,即...

    Java+flex使用dom4j读写xml

    2.Java方面,使用dom4j对xml进行操作,包括节点的读取,添加,修改,删除。 3.Flex方面,使用DataGrid呈现数据;使用RemoteObject构建和Java的通信;使用到了验证控件Validator;使用了CSS样式对Alert对话框进行了...

Global site tag (gtag.js) - Google Analytics