首页 > 代码库 > Java操作Xml

Java操作Xml

一、创建DOM

  1 XMLBuilder.java
  2  
  3  用于创建DOM,Root结点
  4  
  5 /********************************************************************
  6  * 项目名称    :rochoc   <p>
  7  * 包名称      :rochoc.xml.oper <p>
  8  * 文件名称    :XmlBuilder   <p>
  9  * 编写者     :luoc    <p>
 10  * 编写日期    :2005-6-22    <p>
 11  * 程序功能(类)描述 : 根据传入的XML文件生成Document和root结点<p>
 12  *
 13  * 程序变更日期   :
 14  * 变更作者    :
 15  * 变更说明    :
 16 ********************************************************************/
 17 package rochoc.xml.oper;
 18  
 19 import java.io.File;
 20 import java.io.IOException;
 21  
 22 import javax.xml.parsers.DocumentBuilder;
 23 import javax.xml.parsers.DocumentBuilderFactory;
 24 import javax.xml.parsers.ParserConfigurationException;
 25  
 26 import org.apache.log4j.Logger;
 27 import org.w3c.dom.Document;
 28 import org.w3c.dom.Element;
 29 import org.xml.sax.SAXException;
 30  
 31 /**
 32  * 类名:XmlBuilder  <p>
 33  * 类描述:根据传入的XML文件生成Document和root结点 <p>
 34  * 编写者 :luoc<p>
 35  * 编写日期 :2005-6-22<p>
 36  * 主要public成员变量:<p>
 37  * 主要public方法:   <p>
 38  **/
 39  
 40 public class XmlBuilder
 41 {
 42     /**
 43      *构造函数说明:       <p>
 44      *参数说明:@param path   <p>
 45     **/
 46     public XmlBuilder(String path)
 47     {
 48         this.path=path;
 49         init();
 50     }
 51      
 52     /**
 53     * 方法名称:init<p>
 54     * 方法功能:初始化函数<p>
 55     * 参数说明: <p>
 56     * 返回:void <p>
 57     * 作者:luoc
 58     * 日期:2005-6-22
 59     **/
 60     public void init()
 61     {
 62         buildDocument();
 63         buildRoot();
 64     }
 65      
 66     /**
 67     * 方法名称:buildDocument<p>
 68     * 方法功能:将XML文件生成Document <p>
 69     * 参数说明: <p>
 70     * 返回:void <p>
 71     * 作者:luoc
 72     * 日期:2005-6-22
 73     **/
 74     private void buildDocument()
 75     {
 76         DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
 77         try
 78         {
 79             DocumentBuilder builder=factory.newDocumentBuilder();
 80             logger.debug("Construct document builder success.");
 81             doc=builder.parse(new File(path));           
 82             logger.debug("Build xml document success.");
 83         }catch(ParserConfigurationException e)
 84         {
 85             logger.error("Construct document builder error:"+e);
 86         }catch(SAXException e)
 87         {
 88             logger.error("Parse xml file error:"+e);
 89         }catch(IOException e)
 90         {
 91             logger.error("Read xml file error:"+e);
 92         }
 93     }
 94      
 95     /**
 96     * 方法名称:buildRoot<p>
 97     * 方法功能:生成XML的根结点<p>
 98     * 参数说明: <p>
 99     * 返回:void <p>
100     * 作者:luoc
101     * 日期:2005-6-22
102     **/
103     private void buildRoot()
104     {
105         root=doc.getDocumentElement();
106     }
107      
108     /**
109      * @return 返回 doc。
110      */
111     public Document getDoc()
112     {
113         return doc;
114     }
115     /**
116      * @param doc 要设置的 doc。
117      */
118     public void setDoc(Document doc)
119     {
120         this.doc = doc;
121     }
122     /**
123      * @return 返回 path。
124      */
125     public String getPath()
126     {
127         return path;
128     }
129     /**
130      * @param path 要设置的 path。
131      */
132     public void setPath(String path)
133     {
134         this.path = path;
135     }
136     /**
137      * @return 返回 root。
138      */
139     public Element getRoot()
140     {
141         return root;
142     }
143     /**
144      * @param root 要设置的 root。
145      */
146     public void setRoot(Element root)
147     {
148         this.root = root;
149     }
150     /*全局变量*/
151     private String path=null;//xml文件路径
152     private Document doc=null;//xml文件对应的document
153     private Element root=null;//xml文件的根结点
154     private Logger logger=Logger.getLogger(getClass().getName());
155 }

二、查找,插入,删除,修改

  1 XmlOper.java
  2  
  3  用于操作XML文件,包括查找、新增、删除、修改结点
  4  
  5  /********************************************************************
  6  * 项目名称    :rochoc   <p>
  7  * 包名称      :rochoc.xml.oper <p>
  8  * 文件名称    :XmlOper   <p>
  9  * 编写者     :luoc    <p>
 10  * 编写日期    :2005-6-22    <p>
 11  * 程序功能(类)描述 : 对XML进行读写操作      <p>
 12  *
 13  * 程序变更日期   :
 14  * 变更作者    :
 15  * 变更说明    :
 16 ********************************************************************/
 17 package rochoc.xml.oper;
 18  
 19 import java.util.ArrayList;
 20  
 21 import org.apache.log4j.Logger;
 22 import org.w3c.dom.Document;
 23 import org.w3c.dom.Element;
 24 import org.w3c.dom.Node;
 25 import org.w3c.dom.NodeList;
 26  
 27 /**
 28  * 类名:XmlOper  <p>
 29  * 类描述:对XML文件进行读写操作,均为静态函数 <p>
 30  * 编写者 :luoc<p>
 31  * 编写日期 :2005-6-22<p>
 32  * 主要public成员变量:<p>
 33  * 主要public方法:   <p>
 34  **/
 35  
 36 public class XmlOper
 37 {
 38     /**
 39      *构造函数说明:       <p>
 40      *参数说明:   <p>
 41     **/
 42     private XmlOper()
 43     {       
 44     }
 45      
 46     /**
 47     * 方法名称:getNodeList<p>
 48     * 方法功能:获取父结点parent的所有子结点<p>
 49     * 参数说明:@param parent
 50     * 参数说明:@return <p>
 51     * 返回:NodeList <p>
 52     * 作者:luoc
 53     * 日期:2005-6-22
 54     **/
 55     public static NodeList getNodeList(Element parent)
 56     {
 57         return parent.getChildNodes();
 58     }
 59      
 60     /**
 61     * 方法名称:getElementsByName<p>
 62     * 方法功能:在父结点中查询指定名称的结点集            <p>
 63     * 参数说明:@param parent
 64     * 参数说明:@param name
 65     * 参数说明:@return <p>
 66     * 返回:Element[] <p>
 67     * 作者:luoc
 68     * 日期:2005-6-22
 69     **/
 70     public static Element [] getElementsByName(Element parent,String name)
 71     {
 72         ArrayList resList=new ArrayList();
 73         NodeList nl=getNodeList(parent);
 74         for(int i=0;i<nl.getLength();i++)
 75         {
 76             Node nd=nl.item(i);
 77             if(nd.getNodeName().equals(name))
 78             {
 79                 resList.add(nd);
 80             }
 81         }
 82         Element [] res=new Element [resList.size()];
 83         for(int i=0;i<resList.size();i++)
 84         {
 85             res[0]=(Element)resList.get(i);
 86         }       
 87         logger.debug(parent.getNodeName()+"‘s children of "+name+
 88                 "‘s num:"+res.length);
 89         return res;
 90     }
 91      
 92     /**
 93     * 方法名称:getElementName<p>
 94     * 方法功能:获取指定Element的名称            <p>
 95     * 参数说明:@param element
 96     * 参数说明:@return <p>
 97     * 返回:String <p>
 98     * 作者:luoc
 99     * 日期:2005-6-22
100     **/
101     public static String getElementName(Element element)
102     {
103         return element.getNodeName();
104     }
105      
106     /**
107     * 方法名称:getElementValue<p>
108     * 方法功能:获取指定Element的值<p>
109     * 参数说明:@param element
110     * 参数说明:@return <p>
111     * 返回:String <p>
112     * 作者:luoc
113     * 日期:2005-6-22
114     **/
115     public static String getElementValue(Element element)
116     {
117         NodeList nl=element.getChildNodes();
118         for(int i=0;i<nl.getLength();i++)
119         {
120             if(nl.item(i).getNodeType()==Node.TEXT_NODE)//是一个Text Node
121             {           
122                 logger.debug(element.getNodeName()+" has a Text Node.");
123                 return element.getFirstChild().getNodeValue();
124             }
125         }  
126         logger.error(element.getNodeName()+" hasn‘t a Text Node.");
127         return null;
128     }
129      
130     /**
131     * 方法名称:getElementAttr<p>
132     * 方法功能:获取指定Element的属性attr的值            <p>
133     * 参数说明:@param element
134     * 参数说明:@param attr
135     * 参数说明:@return <p>
136     * 返回:String <p>
137     * 作者:luoc
138     * 日期:2005-6-22
139     **/
140     public static String getElementAttr(Element element,String attr)
141     {
142         return element.getAttribute(attr);
143     }
144      
145     /**
146     * 方法名称:setElementValue<p>
147     * 方法功能:设置指定Element的值            <p>
148     * 参数说明:@param element
149     * 参数说明:@param val <p>
150     * 返回:void <p>
151     * 作者:luoc
152     * 日期:2005-6-22
153     **/
154     public static void setElementValue(Element element,String val)
155     {
156         Node node=element.getOwnerDocument().createTextNode(val);
157         NodeList nl=element.getChildNodes();
158         for(int i=0;i<nl.getLength();i++)
159         {
160             Node nd=nl.item(i);
161             if(nd.getNodeType()==Node.TEXT_NODE)//是一个Text Node
162             {           
163                   nd.setNodeValue(val);
164                   logger.debug("modify "+element.getNodeName()+"‘s node value succe.");
165                   return;
166             }
167         }  
168         logger.debug("new "+element.getNodeName()+"‘s node value succe.");
169         element.appendChild(node);       
170     }
171      
172     /**
173     * 方法名称:setElementAttr<p>
174     * 方法功能:设置结点Element的属性<p>
175     * 参数说明:@param element
176     * 参数说明:@param attr
177     * 参数说明:@param attrVal <p>
178     * 返回:void <p>
179     * 作者:luoc
180     * 日期:2005-6-22
181     **/
182     public static void setElementAttr(Element element,
183             String attr,String attrVal)
184     {
185         element.setAttribute(attr,attrVal);
186     }
187      
188      
189     /**
190     * 方法名称:addElement<p>
191     * 方法功能:在parent下增加结点child<p>
192     * 参数说明:@param parent
193     * 参数说明:@param child <p>
194     * 返回:void <p>
195     * 作者:luoc
196     * 日期:2005-6-22
197     **/
198     public static void addElement(Element parent,Element child)
199     {
200         parent.appendChild(child);
201     }
202      
203     /**
204     * 方法名称:addElement<p>
205     * 方法功能:在parent下增加字符串tagName生成的结点<p>
206     * 参数说明:@param parent
207     * 参数说明:@param tagName <p>
208     * 返回:void <p>
209     * 作者:luoc
210     * 日期:2005-6-22
211     **/
212     public static void addElement(Element parent,String tagName)
213     {       
214         Document doc=parent.getOwnerDocument();
215         Element child=doc.createElement(tagName);
216         parent.appendChild(child);
217     }
218      
219     /**
220     * 方法名称:addElement<p>
221     * 方法功能:在parent下增加tagName的Text结点,且值为text<p>
222     * 参数说明:@param parent
223     * 参数说明:@param tagName
224     * 参数说明:@param text <p>
225     * 返回:void <p>
226     * 作者:luoc
227     * 日期:2005-6-22
228     **/
229     public static void addElement(Element parent,String tagName,String text)
230     {
231         Document doc=parent.getOwnerDocument();
232         Element child=doc.createElement(tagName);
233         setElementValue(child,text);
234         parent.appendChild(child);
235     }
236      
237     /**
238     * 方法名称:removeElement<p>
239     * 方法功能:将父结点parent下的名称为tagName的结点移除<p>
240     * 参数说明:@param parent
241     * 参数说明:@param tagName <p>
242     * 返回:void <p>
243     * 作者:luoc
244     * 日期:2005-6-22
245     **/
246     public static void removeElement(Element parent,String tagName)
247     {
248         logger.debug("remove "+parent.getNodeName()+"‘s children by tagName "+tagName+" begin...");
249         NodeList nl=parent.getChildNodes();
250         for(int i=0;i<nl.getLength();i++)
251         {
252             Node nd=nl.item(i);
253             if(nd.getNodeName().equals(tagName))
254             {
255                 parent.removeChild(nd);
256                 logger.debug("remove child ‘"+nd+"‘ success.");
257             }
258         }
259         logger.debug("remove "+parent.getNodeName()+"‘s children by tagName "+tagName+" end.");
260     }
261      
262      
263     /*全局变量*/   
264     static Logger logger=Logger.getLogger("XmlOper");
265 }

三、新建XML文件

  1 XmlCreater.java
  2  
  3  用于创建XML文件
  4  
  5 /********************************************************************
  6  * 项目名称    :rochoc   <p>
  7  * 包名称      :rochoc.xml.oper <p>
  8  * 文件名称    :XmlCreater   <p>
  9  * 编写者     :luoc    <p>
 10  * 编写日期    :2005-6-22    <p>
 11  * 程序功能(类)描述 : 创建DOM并生成XML文件      <p>
 12  *
 13  * 程序变更日期   :
 14  * 变更作者    :
 15  * 变更说明    :
 16 ********************************************************************/
 17 package rochoc.xml.oper;
 18  
 19 import java.io.File;
 20  
 21 import javax.xml.parsers.DocumentBuilder;
 22 import javax.xml.parsers.DocumentBuilderFactory;
 23 import javax.xml.parsers.ParserConfigurationException;
 24 import javax.xml.transform.Transformer;
 25 import javax.xml.transform.TransformerConfigurationException;
 26 import javax.xml.transform.TransformerException;
 27 import javax.xml.transform.TransformerFactory;
 28 import javax.xml.transform.dom.DOMSource;
 29 import javax.xml.transform.stream.StreamResult;
 30  
 31 import org.apache.log4j.Logger;
 32 import org.w3c.dom.Document;
 33 import org.w3c.dom.Element;
 34  
 35 /**
 36  * 类名:XmlCreater  <p>
 37  * 类描述: 创建DOM并生成XML文件<p>
 38  * 编写者 :luoc<p>
 39  * 编写日期 :2005-6-22<p>
 40  * 主要public成员变量:<p>
 41  * 主要public方法:   <p>
 42  **/
 43  
 44 public class XmlCreater
 45 {
 46     /**
 47      *构造函数说明:       <p>
 48      *参数说明:@param path  xml文件路径 <p>
 49     **/
 50     public XmlCreater(String path)
 51     {
 52         this.path=path;
 53         init();
 54     }
 55      
 56     /**
 57     * 方法名称:init<p>
 58     * 方法功能: 初始化函数           <p>
 59     * 参数说明: <p>
 60     * 返回:void <p>
 61     * 作者:luoc
 62     * 日期:2005-6-22
 63     **/
 64     private void init()
 65     {
 66         DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
 67         try
 68         {
 69             DocumentBuilder builder=factory.newDocumentBuilder();
 70             doc=builder.newDocument();//新建DOM
 71         }catch(ParserConfigurationException e)
 72         {
 73             logger.error("Parse DOM builder error:"+e);
 74         }
 75     }
 76      
 77     /**
 78     * 方法名称:createRootElement<p>
 79     * 方法功能:创建根结点,并返回            <p>
 80     * 参数说明:@param rootTagName <p>
 81     * 返回:Element <p>
 82     * 作者:luoc
 83     * 日期:2005-6-22
 84     **/
 85     public Element createRootElement(String rootTagName)
 86     {    
 87         if(doc.getDocumentElement()==null)
 88         {
 89             logger.debug("create root element ‘"+rootTagName+"‘ success.");
 90             Element root=doc.createElement(rootTagName);
 91             doc.appendChild(root);
 92             return root;
 93         }
 94         logger.warn("this dom‘s root element is exist,create fail.");
 95         return doc.getDocumentElement();
 96     }
 97      
 98     /**
 99     * 方法名称:createElement<p>
100     * 方法功能:在parent结点下增加子结点tagName<p>
101     * 参数说明:@param parent
102     * 参数说明:@param tagName <p>
103     * 返回:Element <p>
104     * 作者:luoc
105     * 日期:2005-6-22
106     **/
107     public Element createElement(Element parent,String tagName)
108     {
109         Document doc=parent.getOwnerDocument();
110         Element child=doc.createElement(tagName);
111         parent.appendChild(child);       
112         return child;
113     }
114      
115     /**
116     * 方法名称:createElement<p>
117     * 方法功能:在parent结点下增加值为value的子结点tabName<p>
118     * 参数说明:@param parent
119     * 参数说明:@param tagName
120     * 参数说明:@param value <p>
121     * 返回:Element <p>
122     * 作者:luoc
123     * 日期:2005-6-22
124     **/
125     public Element createElement(Element parent,String tagName,String value)
126     {
127         Document doc=parent.getOwnerDocument();
128         Element child=doc.createElement(tagName);
129         XmlOper.setElementValue(child,value);
130         parent.appendChild(child);
131         return child;
132     }
133      
134     /**
135     * 方法名称:createAttribute<p>
136     * 方法功能:在parent结点下增加属性 <p>
137     * 参数说明:@param parent
138     * 参数说明:@param attrName 属性名
139     * 参数说明:@param attrValue 属性值<p>
140     * 返回:void <p>
141     * 作者:luoc
142     * 日期:2005-6-22
143     **/
144     public void createAttribute(Element parent,String attrName,String attrValue)
145     {
146         XmlOper.setElementAttr(parent,attrName,attrValue);       
147     }
148      
149     /**
150     * 方法名称:buildXmlFile<p>
151     * 方法功能:根据DOM生成XML文件<p>
152     * 参数说明: <p>
153     * 返回:void <p>
154     * 作者:luoc
155     * 日期:2005-6-22
156     **/
157     public void buildXmlFile()
158     {
159         TransformerFactory tfactory=TransformerFactory.newInstance();
160         try
161         {
162             Transformer transformer=tfactory.newTransformer();
163             DOMSource source=new DOMSource(doc);
164             logger.debug("New DOMSource success.");
165             StreamResult result=new StreamResult(new File(path));
166             logger.debug("New StreamResult success.");
167             transformer.setOutputProperty("encoding","GBK");
168             transformer.transform(source,result);
169             logger.debug("Build XML File ‘"+path+"‘ success.");
170         }catch(TransformerConfigurationException e)
171         {
172             logger.error("Create Transformer error:"+e);
173         }catch(TransformerException e)
174         {
175             logger.error("Transformer XML file error:"+e);
176         }
177     }
178      
179     /**
180      * @return 返回 doc。
181      */
182     public Document getDoc()
183     {
184         return doc;
185     }
186     /**
187      * @param doc 要设置的 doc。
188      */
189     public void setDoc(Document doc)
190     {
191         this.doc = doc;
192     }
193     /**
194      * @return 返回 path。
195      */
196     public String getPath()
197     {
198         return path;
199     }
200     /**
201      * @param path 要设置的 path。
202      */
203     public void setPath(String path)
204     {
205         this.path = path;
206     }
207     /*全局变量*/
208     private Logger logger = Logger.getLogger(getClass().getName());
209     private Document doc=null;//新创建的DOM
210     private String path=null;//生成的XML文件绝对路径
211 }

 

转载自:http://www.cnblogs.com/ITEagle/archive/2010/03/03/1677431.html