`
hq369
  • 浏览: 12145 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

DOM4J处理XML方法记录,附XPATH写法

    博客分类:
  • JAVA
阅读更多
package com.test;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
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 com.baje.sz.util.Doc;

public class Dom4jSoap {
	
	/**
	 * 取根元素
	 * @param path
	 * @return
	 * @throws DocumentException
	 */
	public static Element getRoot(String path) throws DocumentException{
		Document document;
		SAXReader reader=new SAXReader();
		document=reader.read(new File(path));
		Element root=document.getRootElement();
		return root;
	}
	public static void readSoap(Element element){
		if(element.elements().size()==0){
			System.out.println(element.getName()+"*="+element.getText());
			return;
		}
		
		for (Iterator<Element> iter=element.elementIterator();iter.hasNext();) {
			Element ele=iter.next();
			if(ele.getParent().getName().equalsIgnoreCase("Envelope")){
				System.out.println("-------------------------Envelope的直接子元素:"+ele.getName()+",,"+ele.attributeValue("xmlns"));
				
			}
			System.out.println(ele.getName()+"%="+ele.getText().trim());
			if(ele.elements().size()!=0){
				System.out.println(("element "+ele.getName()+" has "+ele.elements().size())+(ele.elements().size()==1?" subTag it is ":" subTags there are"));
				readSoap(ele);				
			}	
			if(ele.getName().equals("UserName")){
				System.out.println("path="+ele.getPath());
			}
		}
	}
	/**
	 * 获取节点的元素的值
	 * @param filename
	 * @param xmlpath="//*[name()='Date'][@id='aa']/*[name()='aaa']"
	 * @return
	 */
	public static String getElementText(String filename, String xmlpath,String encode) {
		try {
			Document document;
			SAXReader reader=new SAXReader();
			InputStream in = new FileInputStream(new File(filename));
			document=reader.read(in,encode);
			List list = document.selectNodes(xmlpath);
			for(Iterator iter = list.iterator();iter.hasNext();){
				Element e = (Element)iter.next();
	            return e.getText(); 
			}	            
			return "";
		} catch (Exception e) {
			e.printStackTrace();
			return "";
		}
	}
	/**
	 * 取指定节点元素的属性的值
	 * @param filename
	 * @param xmlpath="//*[name()='Date'][@id='bb']/@ac"
	 * @param encode
	 * @return
	 */
	public static String getAttributesText(String filename, String xmlpath,String encode){
		try {
			Document document;
			SAXReader reader=new SAXReader();
			InputStream in = new FileInputStream(new File(filename));
			document=reader.read(in,encode);
			List list = document.selectNodes(xmlpath);
			for(Iterator iter=list.iterator();iter.hasNext();){
				Attribute a = (Attribute)iter.next();
				return a.getText();
			}				            
			return "";
		} catch (Exception e) {
			e.printStackTrace();
			return "";
		}
	}
	/**
	 * 获取指定元素下所有元素值到LIST
	 * @param filename
	 * @param xmlpath="//*[name()='Date']"
	 * @param encode
	 * @return
	 */
	public static List xmlElement2List(String filename,String xmlpath,String encode) {
		try {
			List xmllist = new ArrayList();
			SAXReader reader=new SAXReader();
			InputStream in = new FileInputStream(new File(filename));
			Document document = reader.read(in,encode);
			List list = document.selectNodes(xmlpath);
			for(Iterator iter=list.iterator();iter.hasNext();){				
				Element e = (Element)iter.next();	
				Doc doc = new Doc();
				for(Iterator iter2=e.elementIterator();iter2.hasNext();){
					Element e2=(Element)iter2.next();
					doc.put(e2.getName(), e2.getText());
				}				
				xmllist.add(doc);
			}
			
	        return xmllist;    
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}
	/**
	 * 获取指定元素的属性值
	 * @param filename
	 * @param xmlpath="//*[name()='Date']"
	 * @param encode
	 * @return
	 */
	public static List xmlAttributes2List(String filename,String xmlpath,String encode) {
		try {
			List xmllist = new ArrayList();
			SAXReader reader=new SAXReader();
			InputStream in = new FileInputStream(new File(filename));
			Document document = reader.read(in,encode);
			List list = document.selectNodes(xmlpath);
			for(Iterator iter=list.iterator();iter.hasNext();){
				Element e = (Element)iter.next();	           
				Doc doc = new Doc();
				for(Iterator iter2=e.attributeIterator();iter2.hasNext();){
					Attribute attribute = (Attribute)iter2.next();	            		 
					doc.put(attribute.getName(),attribute.getValue());
				}
				xmllist.add(doc);
			}
			
	        return xmllist;    
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}
	/**
	 * 取指定节点的子元素存到DOC
	 * @param filename
	 * @param xmlpath="//*[name()='Date'][@id='bb']",
	 * @param encode
	 * @return
	 */
	public static Doc xmlElement2Doc(String filename,String xmlpath,String encode){
		try{
			SAXReader reader=new SAXReader();
			InputStream in = new FileInputStream(new File(filename));
			Document document = reader.read(in,encode);
			List list = document.selectNodes(xmlpath);
			Doc doc = new Doc();
			for(Iterator iter = list.iterator();iter.hasNext();){
				Element e = (Element)iter.next();
				for(Iterator iter2 = e.elementIterator();iter2.hasNext();){
					Element e2 = (Element)iter2.next();
					doc.put(e2.getName(), e2.getText());
				}
				
			}
			return doc;			
		}catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}
	/**
	 * 取指定节点的属性值到DOC
	 * @param filename
	 * @param xmlpath="//*[name()='Date'][@id='bb']"
	 * @param encode
	 * @return
	 */
	public static Doc xmlAttribute2Doc(String filename,String xmlpath,String encode){
		try{
			SAXReader reader=new SAXReader();
			InputStream in = new FileInputStream(new File(filename));
			Document document = reader.read(in,encode);
			List list = document.selectNodes(xmlpath);
			Doc doc = new Doc();
			for(Iterator iter = list.iterator();iter.hasNext();){
				Element e =(Element)iter.next();
				for(Iterator iter2=e.attributeIterator();iter2.hasNext();){
					Attribute a = (Attribute)iter2.next();
					doc.put(a.getName(), a.getValue());
				}				
			}
			return doc;
		}catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}
	/**
	 * XML文件转为STRING
	 * @param filename
	 * @param encode
	 * @return
	 */
	public static String xml2string(String filename,String encode){
		try{
			SAXReader reader=new SAXReader();
			InputStream in = new FileInputStream(new File(filename));
			Document document = reader.read(in,encode);
			return document.asXML();
		}catch (Exception e) {
			e.printStackTrace();
			return "";
		}
	}
	/**
	 * STRING转为XML
	 * @param str
	 * @return
	 */
	public static Document string2xml(String str){
		try{
			Document document = DocumentHelper.parseText(str);
			return document;
		}catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}
	/**
	 * 创建XML文件
	 * @param document
	 * @param filepath
	 * @param encode
	 * @return
	 */
	public static int createXmlFile(Document document,String filepath,String encode){
		XMLWriter writer = null;
		try{
			File file = new File(filepath);
			OutputFormat format = OutputFormat.createPrettyPrint();
			format.setEncoding(encode);
			writer = new XMLWriter(new OutputStreamWriter(new FileOutputStream(file),encode), format);
			writer.write(document);
			writer.close();
			return 0;
		}catch (Exception e) {
			e.printStackTrace();
			return -1;
		}
	}
	/**
	 * 将LIST数据写入到节点元素值
	 * @param list
	 * @param filepath
	 * @param xmlroot
	 * @param row
	 * @param encode
	 * @return
	 */
	public static int createXmlList2Element(List list, String filepath,String xmlroot,String row,String encode) {
		try {
			if (xmlroot.equals("")){
				xmlroot="xml";
			}				
			if (row.equals("")){
				row="row";
			}				
		    Document document = DocumentHelper.createDocument();
			Element rootElement  = document.addElement(xmlroot);
			Element rowxml,index;

			if(list != null && !list.isEmpty()) {
				for(Iterator its2 = list.iterator();its2.hasNext();) {
					Doc rowDoc = (Doc)its2.next();
					Set set = rowDoc.keySet();
					rowxml = rootElement.addElement(row);
					for (Iterator its = set.iterator(); its.hasNext();) {
						String key = (String) its.next();
						String values = rowDoc.get(key);						
						index = rowxml.addElement(key);
						index.setText(String.valueOf(values));					
					}				
				}
			} 
			createXmlFile(document,filepath,encode);
			return 0;
		} catch (Exception e) {
			e.printStackTrace();
			return -1;
		} 
	}
	/**
	 *  根据XPATH插入LIST的值到指定节点元素值
	 * @param list
	 * @param filepath
	 * @param xmlpath
	 * @param row
	 * @param attrDoc=row节点属性KEY VALUE
	 * @return
	 */
	public static int list2Element(List list ,String filepath,String xmlpath,String row,Doc attrDoc, String encode){
		try{
			SAXReader reader=new SAXReader();
			InputStream in = new FileInputStream(new File(filepath));
			Document document = reader.read(in,encode);
			/** 先用xpath查找对象 */
			List xlist = document.selectNodes(xmlpath);
			Iterator iter = xlist.iterator();
			if(iter.hasNext()){
				Element e = (Element)iter.next();
				Element e2=e.addElement(row);
				if(attrDoc!=null && !attrDoc.isEmpty()){
					Set aset = attrDoc.keySet();
					for(Iterator aits = aset.iterator();aits.hasNext();){
						String akey=(String)aits.next();
						e2.addAttribute(akey, attrDoc.get(akey));
					}
				}
				if(list!=null && !list.isEmpty()){
					for(Iterator its=list.iterator();its.hasNext();){
						Doc doc = (Doc)its.next();
						Set set = doc.keySet();
						for(Iterator its2=set.iterator();its2.hasNext();){
							String key = (String)its2.next();
							String values = doc.get(key);
							Element e3=e2.addElement(key);
							e3.setText(values);
						}						
						
					}
				}
			}
			createXmlFile(document,filepath,encode);
			return 0;
		}catch (Exception e) {
			e.printStackTrace();
			return -1;
		} 
	}
	/**
	 * 将LIST数据写入到节点属性值
	 * @param list
	 * @param filepath
	 * @param xmlroot
	 * @param row
	 * @param encode
	 * @return
	 */
	public static int createXmlList2Attrbute(List list, String filepath,String xmlroot,String row,String encode) {
		try {
			if (xmlroot.equals("")){
				xmlroot="xml";
			}				
			if (row.equals("")){
				row="row";
			}				
		    Document document = DocumentHelper.createDocument();
			Element rootElement  = document.addElement(xmlroot);
			Element rowxml;
			if(list != null && !list.isEmpty()) {
				for(Iterator its2 = list.iterator();its2.hasNext();) {
					Doc rowDoc = (Doc)its2.next();
					Set set = rowDoc.keySet();
					rowxml = rootElement.addElement(row);
					for (Iterator its = set.iterator(); its.hasNext();) {
						String key = (String) its.next();
						String values = rowDoc.get(key);
						rowxml.addAttribute(key,values);				
					}				
				}
			} 
			createXmlFile(document,filepath,encode);
			return 0;
		} catch (Exception e) {
			e.printStackTrace();
			return -1;
		} 
	}
	/**
	 * 根据XPATH修改指定节点的属性值
	 * @param filepath
	 * @param xmlpath
	 * @param row
	 * @param attrDoc
	 * @param encode
	 * @return
	 */
	public static int doc2attrbute(String filepath,String xmlpath,String row,Doc attrDoc, String encode){
		try{
			SAXReader reader=new SAXReader();
			InputStream in = new FileInputStream(new File(filepath));
			Document document = reader.read(in,encode);
			/** 先用xpath查找对象 */
			List xlist = document.selectNodes(xmlpath);
			Iterator iter = xlist.iterator();
			if(iter.hasNext()){
				Element e = (Element)iter.next();
				Element e2=e.addElement(row);
				if(attrDoc!=null && !attrDoc.isEmpty()){
					Set aset = attrDoc.keySet();
					for(Iterator aits = aset.iterator();aits.hasNext();){
						String akey=(String)aits.next();
						e2.addAttribute(akey, attrDoc.get(akey));
					}
				}
			}
			createXmlFile(document,filepath,encode);
			return 0;
		}catch (Exception e) {
			e.printStackTrace();
			return -1;
		} 
	}
	/**
	 * 根据XPATH修改指定节点元素值 
	 * @param filename
	 * @param xmlpath="//*[name()='Date'][@id='aa']/*[name()='aaa']"
	 * @param value
	 * @param encode
	 * @return
	 */
	public static int ModiXmlElement(String filename,String xmlpath,String value,String encode){
		int returnValue = -1;
		try{
			SAXReader reader=new SAXReader();
			InputStream in = new FileInputStream(new File(filename));
			Document document = reader.read(in,encode);
			/** 先用xpath查找对象 */
			List list = document.selectNodes(xmlpath);
			Iterator iter = list.iterator();
			while(iter.hasNext()){
				Element ownerElement = (Element)iter.next();
				ownerElement.setText(value);
			}
			try{
				/** 将document中的内容写入文件中 */
				createXmlFile(document,filename,encode);
	           	/** 执行成功,需返回0 */
	            returnValue = 0;
			}catch(Exception ex){
				ex.printStackTrace();
			}
		}catch(Exception ex){
			ex.printStackTrace();
		}
		return returnValue;
	}
	/**
	 * 根据XPATH修改指定节点的指定属性值
	 * @param filename
	 * @param xmlpath="//*[name()='Date'][@id='aa']"
	 * @param node
	 * @param value
	 * @param encode
	 * @return
	 */
	public static int ModiXmlFileAttrbute(String filename,String xmlpath,String node,String value,String encode){
        int returnValue = -1;
        try{
        	SAXReader reader=new SAXReader();
			InputStream in = new FileInputStream(new File(filename));
			Document document = reader.read(in,encode);
            /** 修改内容之一: 如果book节点中show参数的内容为yes,则修改成no */
            /** 先用xpath查找对象 */
           // List list = document.selectNodes("/books/book/@show" );    
            List list = document.selectNodes(xmlpath);
            Iterator iter = list.iterator();
            while(iter.hasNext()){
            	 Element e = (Element)iter.next();
            	 e.addAttribute(node,value);           
            }
            try{
                /** 将document中的内容写入文件中 */
            	createXmlFile(document,filename,encode);            	
                /** 执行成功,需返回0 */
                returnValue = 0;
            }catch(Exception ex){
                ex.printStackTrace();
            }
        } catch(Exception ex){
        	ex.printStackTrace();
        }
        return returnValue;
	}
	/**
	 * 删除指定节点
	 * @param filename
	 * @param xmlpath
	 * @param value
	 * @param encode
	 * @param i,1=0为删除当前row节点,1为删除row父节点
	 * @return
	 */
	public static int delElement(String filename,String xmlpath,String row,String value,String encode,int i){
		int returnValue=-1;
		try{
			SAXReader reader=new SAXReader();
			InputStream in = new FileInputStream(new File(filename));
			Document document = reader.read(in,encode);
			List list = document.selectNodes(xmlpath);
			for(Iterator its = list.iterator();its.hasNext();){
				Element e = (Element)its.next();
				for(Iterator iter2=e.elementIterator(row);iter2.hasNext();){
					Element e2=(Element)iter2.next();
					if(e2.getText().equals(value)){
						if(i==0){
							e.remove(e2);
						}else if(i==1){
							e.getParent().remove(e);
						}						
					}
				}
			}
			createXmlFile(document,filename,encode);
			returnValue=0;
		} catch(Exception ex){
        	ex.printStackTrace();
        }
        return returnValue;
	}
	/**
	 * 删除指定属性的节点,xmlpath包含属性值
	 * @param filename
	 * @param xmlpath="//*[name()='Dates']/*[name()='Date'][@ac='7788']"
	 * @param encode
	 * @return
	 */
	public static int delAttrbute(String filename,String xmlpath,String encode){
		int returnValue=-1;
		try{
			SAXReader reader=new SAXReader();
			InputStream in = new FileInputStream(new File(filename));
			Document document = reader.read(in,encode);
			List list = document.selectNodes(xmlpath);
			for(Iterator its = list.iterator();its.hasNext();){
				Element e = (Element)its.next();
				e.getParent().remove(e);
			}
			createXmlFile(document,filename,encode);
			returnValue=0; 
		}catch(Exception ex){
        	ex.printStackTrace();
        }
        return returnValue;
	}
	public static void main(String[] args) throws DocumentException {
		//String path1="F:/workspace/HelloWorlds/aa.xml";
		String path="F:/workspace/HelloWorlds/cc.xml";
		//System.out.println(Dom4jSoap.getElementText(path1, "/soap:Envelope/soap:Body/*[name()='Login']/*[name()='loginRequest']/*[name()='UserName']","uft-8"));
		//System.out.println(Dom4jSoap.getElementText(path, "//*[name()='Date'][@id='aa']/*[name()='aad']","uft-8"));//"//"表示从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。
		//System.out.println(Dom4jSoap.getAttributesText(path,"//*[name()='Date'][@id='bb']/@ac","utf-16"));
		//System.out.println(Dom4jSoap.getElementText(path, "/soap:Envelope/soap:Body/*[name()='GetHotelInventoryResult']/*[name()='Hotels']/*[name()='Hotel']/*[name()='Rooms']/*[name()='RoomType']/*[name()='Dates']/*[name()='Date'][@di='aa']/*[name()='aad']","utf-16"));
		//System.out.println(Dom4jSoap.xmlElement2List(path,"//*[name()='Date']","utf-16"));
		//System.out.println(Dom4jSoap.xmlAttributes2List(path,"//*[name()='Date']","utf-16"));
		//Dom4jSoap.xmlElement2Doc(path,"//*[name()='Date'][@id='bb']","utf-16");
		//Dom4jSoap.xmlAttribute2Doc(path,"//*[name()='Date'][@id='bb']","utf-16");
		//System.out.println(Dom4jSoap.xml2string(path,"utf-16"));
		//Document document = Dom4jSoap.string2xml("<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"><soap:Body><person id=\"aa\"><name>afds</name></person></soap:Body></soap:Envelope>");
		//Dom4jSoap.createXmlFile(document, "F:/workspace/HelloWorlds/dd.xml", "utf-16");
		//List list = new ArrayList();
		//Doc doc = new Doc();
		//doc.put("aa", 1);
		//doc.put("bb", 2);
		//list.add(doc);
		//doc.put("aa", 11);
		//doc.put("bb", 12);
		//list.add(doc);		
		//Dom4jSoap.createXmlList2Element(list, "F:/workspace/HelloWorlds/dd.xml", "test", "room", "utf-8");
		//Dom4jSoap.ModiXmlElement("F:/workspace/HelloWorlds/cc.xml", "//*[name()='Date'][@id='aa']/*[name()='aaa']", "222", "utf-16");
		//Dom4jSoap.ModiXmlFileAttrbute("F:/workspace/HelloWorlds/cc.xml", "//*[name()='Date'][@id='aa']","ac", "22232", "utf-16");
		/**
		 * 
		 
		List list = new ArrayList();
		Doc doc = new Doc();
		doc.put("AvailableDate", 1);
		doc.put("AvailableAmount", 2);
		doc.put("RoomInvStatusCode", 3);
		doc.put("IsOverBooking", 4);
		doc.put("BookingStartDate", 5);
		doc.put("BookingEndDate", 6);
		doc.put("BookingBeginTime", 7);
		doc.put("BookingEndTime", 8);
		list.add(doc);
		Doc adoc = new Doc();
		adoc.put("id", "3322");
		adoc.put("ac", "7788");
		Dom4jSoap.list2Element(list, "F:/workspace/HelloWorlds/cc.xml", "//*[name()='Dates']", "Date",adoc, "utf-16");
		*/
		/**
		 * 
		Doc adoc = new Doc();
		adoc.put("id", "3322");
		adoc.put("ac", "7788");
		Dom4jSoap.doc2attrbute("F:/workspace/HelloWorlds/cc.xml", "//*[name()='Dates']", "Date",adoc, "utf-16");
		
		 */
		//Dom4jSoap.delElement("F:/workspace/HelloWorlds/cc.xml", "//*[name()='Dates']/*[name()='Date']","bbt", "7", "utf-16",1);
		Dom4jSoap.delAttrbute("F:/workspace/HelloWorlds/cc.xml", "//*[name()='Dates']/*[name()='Date'][@ac='7788']", "utf-16");
		
	}
}

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics