用dom4j读写xml

一、例子
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:需要Jaxen-1.1-*.jar包
<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)“@”表示属性
<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”可以移掉头部和尾部的空格,或者用单个的空格替换
<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]”,选中含有两个子元素的元素

更多参考>> http://www.zvon.org/xxl/XPathTutorial/General/examples.html

你可能感兴趣的:(数据结构,xml)