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"); } }