Java操作XML(使用org.w3c.dom)

來源:互聯網
上載者:User

一、建立DOM

XMLBuilder.java 用於建立DOM,Root結點/******************************************************************** * 項目名稱    :rochoc   <p> * 包名稱      :rochoc.xml.oper <p> * 檔案名稱    :XmlBuilder   <p> * 編寫者     :luoc    <p> * 編寫日期    :2005-6-22    <p> * 程式功能(類)描述 : 根據傳入的XML檔案產生Document和root結點<p> *  * 程式變更日期   : * 變更作者    : * 變更說明    :********************************************************************/package rochoc.xml.oper;import java.io.File;import java.io.IOException;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import javax.xml.parsers.ParserConfigurationException;import org.apache.log4j.Logger;import org.w3c.dom.Document;import org.w3c.dom.Element;import org.xml.sax.SAXException;/** * 類名:XmlBuilder  <p> * 類描述:根據傳入的XML檔案產生Document和root結點 <p> * 編寫者 :luoc<p> * 編寫日期 :2005-6-22<p> * 主要public成員變數:<p> * 主要public方法:   <p> **/public class XmlBuilder{    /**     *建構函式說明:       <p>     *參數說明:@param path   <p>    **/    public XmlBuilder(String path)    {        this.path=path;        init();    }        /**    * 方法名稱:init<p>    * 方法功能:初始化函數<p>    * 參數說明: <p>    * 返回:void <p>    * 作者:luoc    * 日期:2005-6-22    **/    public void init()    {        buildDocument();        buildRoot();    }        /**    * 方法名稱:buildDocument<p>    * 方法功能:將XML檔案產生Document <p>    * 參數說明: <p>    * 返回:void <p>    * 作者:luoc    * 日期:2005-6-22    **/    private void buildDocument()    {        DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();        try        {            DocumentBuilder builder=factory.newDocumentBuilder();            logger.debug("Construct document builder success.");            doc=builder.parse(new File(path));                        logger.debug("Build xml document success.");        }catch(ParserConfigurationException e)        {            logger.error("Construct document builder error:"+e);        }catch(SAXException e)        {            logger.error("Parse xml file error:"+e);        }catch(IOException e)        {            logger.error("Read xml file error:"+e);        }    }        /**    * 方法名稱:buildRoot<p>    * 方法功能:產生XML的根結點<p>    * 參數說明: <p>    * 返回:void <p>    * 作者:luoc    * 日期:2005-6-22    **/    private void buildRoot()    {        root=doc.getDocumentElement();    }        /**     * @return 返回 doc。     */    public Document getDoc()    {        return doc;    }    /**     * @param doc 要設定的 doc。     */    public void setDoc(Document doc)    {        this.doc = doc;    }    /**     * @return 返回 path。     */    public String getPath()    {        return path;    }    /**     * @param path 要設定的 path。     */    public void setPath(String path)    {        this.path = path;    }    /**     * @return 返回 root。     */    public Element getRoot()    {        return root;    }    /**     * @param root 要設定的 root。     */    public void setRoot(Element root)    {        this.root = root;    }    /*全域變數*/    private String path=null;//xml檔案路徑    private Document doc=null;//xml檔案對應的document    private Element root=null;//xml檔案的根結點    private Logger logger=Logger.getLogger(getClass().getName());}

二、尋找,插入,刪除,修改

XmlOper.java 用於操作XML檔案,包括尋找、新增、刪除、修改結點 /******************************************************************** * 項目名稱    :rochoc   <p> * 包名稱      :rochoc.xml.oper <p> * 檔案名稱    :XmlOper   <p> * 編寫者     :luoc    <p> * 編寫日期    :2005-6-22    <p> * 程式功能(類)描述 : 對XML進行讀寫操作      <p> *  * 程式變更日期   : * 變更作者    : * 變更說明    :********************************************************************/package rochoc.xml.oper;import java.util.ArrayList;import org.apache.log4j.Logger;import org.w3c.dom.Document;import org.w3c.dom.Element;import org.w3c.dom.Node;import org.w3c.dom.NodeList;/** * 類名:XmlOper  <p> * 類描述:對XML檔案進行讀寫操作,均為靜態函數 <p> * 編寫者 :luoc<p> * 編寫日期 :2005-6-22<p> * 主要public成員變數:<p> * 主要public方法:   <p> **/public class XmlOper{    /**     *建構函式說明:       <p>     *參數說明:   <p>    **/    private XmlOper()    {            }        /**    * 方法名稱:getNodeList<p>    * 方法功能:擷取父結點parent的所有子結點<p>    * 參數說明:@param parent    * 參數說明:@return <p>    * 返回:NodeList <p>    * 作者:luoc    * 日期:2005-6-22    **/    public static NodeList getNodeList(Element parent)    {        return parent.getChildNodes();    }        /**    * 方法名稱:getElementsByName<p>    * 方法功能:在父結點中查詢指定名稱的結點集            <p>    * 參數說明:@param parent    * 參數說明:@param name    * 參數說明:@return <p>    * 返回:Element[] <p>    * 作者:luoc    * 日期:2005-6-22    **/    public static Element [] getElementsByName(Element parent,String name)    {        ArrayList resList=new ArrayList();        NodeList nl=getNodeList(parent);        for(int i=0;i<nl.getLength();i++)        {            Node nd=nl.item(i);            if(nd.getNodeName().equals(name))            {                resList.add(nd);            }        }        Element [] res=new Element [resList.size()];        for(int i=0;i<resList.size();i++)        {            res[0]=(Element)resList.get(i);        }                logger.debug(parent.getNodeName()+"'s children of "+name+                "'s num:"+res.length);        return res;    }        /**    * 方法名稱:getElementName<p>    * 方法功能:擷取指定Element的名稱            <p>    * 參數說明:@param element    * 參數說明:@return <p>    * 返回:String <p>    * 作者:luoc    * 日期:2005-6-22    **/    public static String getElementName(Element element)    {        return element.getNodeName();    }        /**    * 方法名稱:getElementValue<p>    * 方法功能:擷取指定Element的值<p>    * 參數說明:@param element    * 參數說明:@return <p>    * 返回:String <p>    * 作者:luoc    * 日期:2005-6-22    **/    public static String getElementValue(Element element)    {        NodeList nl=element.getChildNodes();        for(int i=0;i<nl.getLength();i++)        {            if(nl.item(i).getNodeType()==Node.TEXT_NODE)//是一個Text Node            {                            logger.debug(element.getNodeName()+" has a Text Node.");                return element.getFirstChild().getNodeValue();            }        }           logger.error(element.getNodeName()+" hasn't a Text Node.");        return null;    }        /**    * 方法名稱:getElementAttr<p>    * 方法功能:擷取指定Element的屬性attr的值            <p>    * 參數說明:@param element    * 參數說明:@param attr    * 參數說明:@return <p>    * 返回:String <p>    * 作者:luoc    * 日期:2005-6-22    **/    public static String getElementAttr(Element element,String attr)    {        return element.getAttribute(attr);    }        /**    * 方法名稱:setElementValue<p>    * 方法功能:設定指定Element的值            <p>    * 參數說明:@param element    * 參數說明:@param val <p>    * 返回:void <p>    * 作者:luoc    * 日期:2005-6-22    **/    public static void setElementValue(Element element,String val)    {        Node node=element.getOwnerDocument().createTextNode(val);        NodeList nl=element.getChildNodes();        for(int i=0;i<nl.getLength();i++)        {            Node nd=nl.item(i);            if(nd.getNodeType()==Node.TEXT_NODE)//是一個Text Node            {                              nd.setNodeValue(val);                  logger.debug("modify "+element.getNodeName()+"'s node value succe.");                  return;            }        }           logger.debug("new "+element.getNodeName()+"'s node value succe.");        element.appendChild(node);            }        /**    * 方法名稱:setElementAttr<p>    * 方法功能:設定結點Element的屬性<p>    * 參數說明:@param element    * 參數說明:@param attr    * 參數說明:@param attrVal <p>    * 返回:void <p>    * 作者:luoc    * 日期:2005-6-22    **/    public static void setElementAttr(Element element,            String attr,String attrVal)    {        element.setAttribute(attr,attrVal);    }            /**    * 方法名稱:addElement<p>    * 方法功能:在parent下增加結點child<p>    * 參數說明:@param parent    * 參數說明:@param child <p>    * 返回:void <p>    * 作者:luoc    * 日期:2005-6-22    **/    public static void addElement(Element parent,Element child)    {        parent.appendChild(child);    }        /**    * 方法名稱:addElement<p>    * 方法功能:在parent下增加字串tagName產生的結點<p>    * 參數說明:@param parent    * 參數說明:@param tagName <p>    * 返回:void <p>    * 作者:luoc    * 日期:2005-6-22    **/    public static void addElement(Element parent,String tagName)    {                Document doc=parent.getOwnerDocument();        Element child=doc.createElement(tagName);        parent.appendChild(child);    }        /**    * 方法名稱:addElement<p>    * 方法功能:在parent下增加tagName的Text結點,且值為text<p>    * 參數說明:@param parent    * 參數說明:@param tagName    * 參數說明:@param text <p>    * 返回:void <p>    * 作者:luoc    * 日期:2005-6-22    **/    public static void addElement(Element parent,String tagName,String text)    {        Document doc=parent.getOwnerDocument();        Element child=doc.createElement(tagName);        setElementValue(child,text);        parent.appendChild(child);    }        /**    * 方法名稱:removeElement<p>    * 方法功能:將父結點parent下的名稱為tagName的結點移除<p>    * 參數說明:@param parent    * 參數說明:@param tagName <p>    * 返回:void <p>    * 作者:luoc    * 日期:2005-6-22    **/    public static void removeElement(Element parent,String tagName)    {        logger.debug("remove "+parent.getNodeName()+"'s children by tagName "+tagName+" begin...");        NodeList nl=parent.getChildNodes();        for(int i=0;i<nl.getLength();i++)        {            Node nd=nl.item(i);            if(nd.getNodeName().equals(tagName))            {                parent.removeChild(nd);                logger.debug("remove child '"+nd+"' success.");            }        }        logger.debug("remove "+parent.getNodeName()+"'s children by tagName "+tagName+" end.");    }            /*全域變數*/        static Logger logger=Logger.getLogger("XmlOper");}

三、建立XML檔案

XmlCreater.java 用於建立XML檔案/******************************************************************** * 項目名稱    :rochoc   <p> * 包名稱      :rochoc.xml.oper <p> * 檔案名稱    :XmlCreater   <p> * 編寫者     :luoc    <p> * 編寫日期    :2005-6-22    <p> * 程式功能(類)描述 : 建立DOM並產生XML檔案      <p> *  * 程式變更日期   : * 變更作者    : * 變更說明    :********************************************************************/package rochoc.xml.oper;import java.io.File;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import javax.xml.parsers.ParserConfigurationException;import javax.xml.transform.Transformer;import javax.xml.transform.TransformerConfigurationException;import javax.xml.transform.TransformerException;import javax.xml.transform.TransformerFactory;import javax.xml.transform.dom.DOMSource;import javax.xml.transform.stream.StreamResult;import org.apache.log4j.Logger;import org.w3c.dom.Document;import org.w3c.dom.Element;/** * 類名:XmlCreater  <p> * 類描述: 建立DOM並產生XML檔案<p> * 編寫者 :luoc<p> * 編寫日期 :2005-6-22<p> * 主要public成員變數:<p> * 主要public方法:   <p> **/public class XmlCreater{    /**     *建構函式說明:       <p>     *參數說明:@param path  xml檔案路徑 <p>    **/    public XmlCreater(String path)    {        this.path=path;        init();    }        /**    * 方法名稱:init<p>    * 方法功能: 初始化函數           <p>    * 參數說明: <p>    * 返回:void <p>    * 作者:luoc    * 日期:2005-6-22    **/    private void init()    {        DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();        try        {            DocumentBuilder builder=factory.newDocumentBuilder();            doc=builder.newDocument();//建立DOM        }catch(ParserConfigurationException e)        {            logger.error("Parse DOM builder error:"+e);        }    }        /**    * 方法名稱:createRootElement<p>    * 方法功能:建立根結點,並返回            <p>    * 參數說明:@param rootTagName <p>    * 返回:Element <p>    * 作者:luoc    * 日期:2005-6-22    **/    public Element createRootElement(String rootTagName)    {             if(doc.getDocumentElement()==null)        {            logger.debug("create root element '"+rootTagName+"' success.");            Element root=doc.createElement(rootTagName);            doc.appendChild(root);            return root;        }        logger.warn("this dom's root element is exist,create fail.");        return doc.getDocumentElement();    }        /**    * 方法名稱:createElement<p>    * 方法功能:在parent結點下增加子結點tagName<p>    * 參數說明:@param parent    * 參數說明:@param tagName <p>    * 返回:Element <p>    * 作者:luoc    * 日期:2005-6-22    **/    public Element createElement(Element parent,String tagName)    {        Document doc=parent.getOwnerDocument();        Element child=doc.createElement(tagName);        parent.appendChild(child);                return child;    }        /**    * 方法名稱:createElement<p>    * 方法功能:在parent結點下增加值為value的子結點tabName<p>    * 參數說明:@param parent    * 參數說明:@param tagName    * 參數說明:@param value <p>    * 返回:Element <p>    * 作者:luoc    * 日期:2005-6-22    **/    public Element createElement(Element parent,String tagName,String value)    {        Document doc=parent.getOwnerDocument();        Element child=doc.createElement(tagName);        XmlOper.setElementValue(child,value);        parent.appendChild(child);        return child;    }        /**    * 方法名稱:createAttribute<p>    * 方法功能:在parent結點下增加屬性 <p>    * 參數說明:@param parent    * 參數說明:@param attrName 屬性名稱    * 參數說明:@param attrValue 屬性值<p>    * 返回:void <p>    * 作者:luoc    * 日期:2005-6-22    **/    public void createAttribute(Element parent,String attrName,String attrValue)    {        XmlOper.setElementAttr(parent,attrName,attrValue);            }        /**    * 方法名稱:buildXmlFile<p>    * 方法功能:根據DOM產生XML檔案<p>    * 參數說明: <p>    * 返回:void <p>    * 作者:luoc    * 日期:2005-6-22    **/    public void buildXmlFile()    {        TransformerFactory tfactory=TransformerFactory.newInstance();        try        {            Transformer transformer=tfactory.newTransformer();            DOMSource source=new DOMSource(doc);            logger.debug("New DOMSource success.");            StreamResult result=new StreamResult(new File(path));            logger.debug("New StreamResult success.");            transformer.setOutputProperty("encoding","GBK");            transformer.transform(source,result);            logger.debug("Build XML File '"+path+"' success.");        }catch(TransformerConfigurationException e)        {            logger.error("Create Transformer error:"+e);        }catch(TransformerException e)        {            logger.error("Transformer XML file error:"+e);        }    }        /**     * @return 返回 doc。     */    public Document getDoc()    {        return doc;    }    /**     * @param doc 要設定的 doc。     */    public void setDoc(Document doc)    {        this.doc = doc;    }    /**     * @return 返回 path。     */    public String getPath()    {        return path;    }    /**     * @param path 要設定的 path。     */    public void setPath(String path)    {        this.path = path;    }    /*全域變數*/    private Logger logger = Logger.getLogger(getClass().getName());    private Document doc=null;//新建立的DOM    private String path=null;//產生的XML檔案絕對路徑}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.