Java se對解析操作xml的支持及簡單應用 – JAVA編程語言程序開發技術文章

  在《數據遷移》中遷移的一個核心處理是解析並更新本地xml文件,而這種操作簡單利用java API即可完成。在 javax.xml.parsers包中提供瞭處理xml文件的類,使用它們我們可以將xml文件讀入內存; javax.xml.transform包中提供瞭一些轉換工具,我們可以將一種源樹形轉化為目標樹形結果,例如我們可以將dom型源轉化為InputStream型,這樣可以將內存中的xml文件存儲在硬盤上;而在org.w3c.dom中提供瞭JAVA處理XML的DOM接口,可以幫助我們獲取相應結點,創建結點,處理節點屬性等等操作。

      利用javax.xml.parsers包中,將xml文件的inputstream解析成Document,代碼如下:
[java] 
//所用包: 
import org.w3c.dom.Document; 
import javax.xml.parsers.DocumentBuilder; 
importjavax.xml.parsers.DocumentBuilderFactory; 
  
//解析成document 
DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance(); 
DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder(); 
Document doc = docBuilder.parse(inputStream); 
  
//創建document 
DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance(); 
DocumentBuilder db =dbf.newDocumentBuilder(); 
Document doc = db.newDocument(); 
Node rootNode = doc.createElement(“rootNodeName”); 
doc.appendChild(rootNode); 
       上文內容可以幫助我們從inputstream中解析出xml文件成DOM,或者自己創建Document,以供後續操縱xml。而在《數據遷移》中除瞭要能夠讀取本地xml文件,還要能將修改後的xml文件寫入指定位置,從而導入內容庫中,而這個過程則可以利用javax.xml.transform等包實現。
        在javax.xml.transform包中提供Transformer和TransformerFactory類。其中Transformer類提供瞭方法transform(Source xmlSource, Result outputTarget) ,它能夠幫助我們將xml源以一種形式。
在javax.xml.transform包中定義瞭source和result的接口,而在javax.xml.transform.dom、javax.xml.transform.stream、javax.xml.transform.sax和javax.xml.transform.stax中分別做瞭source和result的不同實現。在《數據遷移》中需要將內存中的dom轉移到Inputstream形式,進而能夠存儲到硬盤中,其實現過程如下所示:
[java] 
import javax.xml.transform.Result; 
import javax.xml.transform.Source; 
import javax.xml.transform.Transformer; 
import javax.xml.transform.TransformerFactory; 
import javax.xml.transform.dom.DOMSource; 
import javax.xml.transform.stream.StreamResult; 
 
import org.w3c.dom.Document; 
 
public InputStream toInputStream(Document doc) { 
        InputStream inputStream = null; 
        StringWriter stringWriter = null; 
        try { 
            TransformerFactory tranFactory = TransformerFactory.newInstance(); 
            Transformer transformer = tranFactory.newTransformer(); 
            Source src = new DOMSource(doc); 
            stringWriter = new StringWriter(); 
            Result dest = new StreamResult(stringWriter); 
            transformer.transform(src, dest); 
 
            StringBuffer sb = stringWriter.getBuffer(); 
            if (stringWriter != null){ 
                stringWriter.close(); 
            } 
inputStream = new ByteArrayInputStream(sb.toString().getBytes("UTF-8")); 
        } catch (Exception e) { 
            logger.error("", e); 
            try { 
                if (stringWriter != null) 
                    stringWriter.close(); 
                if (inputStream != null) 
                    inputStream.close(); 
            } catch (IOException e1) { 
                logger.error("", e); 
            } 
        } 
        return inputStream; 

       上文說明瞭如何將硬盤xml文件讀入內存,以及如何寫入硬盤,其都借助瞭Inputstream,而在xml操作中需要對xml結點及結點屬性進行讀取或設置。如下代碼分別進行展示。
 
[java] 
import org.w3c.dom.Element; 
import org.w3c.dom.Node; 
import org.w3c.dom.NodeList; 
 
//獲取指定結點的相應結點名稱的結點值 
 public String getNodeValue(Node parentNode, String nodeName) { 
        String s = ""; 
        if (parentNode.getNodeType() == Node.ELEMENT_NODE) { 
 
            Element rootElement = (Element) parentNode; 
 
            NodeList childList = rootElement.getElementsByTagName(nodeName); 
            Element childElement = (Element) childList.item(0); 
            if (childElement != null) { 
                NodeList textFNList = childElement.getChildNodes(); 
                if (textFNList != null) { 
                    Node temp = (Node) textFNList.item(0); 
                    if (temp != null) { 
                        s = temp.getNodeValue(); 
                        if (s != null) 
                            s = s.trim(); 
                    } 
                } 
            } 
        } 
        return s; 
 } 
 
//獲取指定結點的子節點 
public NodeList getNodeList(Node node) { 
        NodeList nodeList = node.getChildNodes(); 
        return nodeList; 

//獲取指定結點名稱的結點 
public Node getNodeByTagName(Node parentNode, String tagName) { 
        Element rootElement = (Element) parentNode; 
        NodeList nodeList = rootElement.getElementsByTagName(tagName); 
        if (nodeList.getLength() > 0) 
            return nodeList.item(0); 
        else 
            return null; 

 
//獲取指定結點名稱的結點列表 
public NodeList getNodeListByTagName(Node parentNode, String tagName) { 
        Element rootElement = (Element) parentNode; 
        NodeList nodeList = rootElement.getElementsByTagName(tagName); 
        return nodeList; 

 
//獲取指定屬性值 
public String getNodeAttribute(Node node, String attName) { 
        Element elem = (Element) node; 
        return elem.getAttribute(attName); 

 
//創建結點並設置屬性 
public Node createNode(String tagName, Map<String, String> attributeMap) { 
        Element element = doc.createElement(tagName); 
        if (attributeMap != null && !attributeMap.isEmpty()) { 
            Iterator<Entry<String, String>> it = attributeMap.entrySet() 
                                                             .iterator(); 
            while (it.hasNext()) { 
                Entry<String, String> entry = it.next(); 
                element.setAttribute(entry.getKey(), entry.getValue()); 
            } 
        } 
        return element; 
 } 
      本文簡單介紹瞭java se中操作xml的包和類,並在此基礎上提供瞭解析和轉化inputstream以及操作結點和結點屬性的方法,為日後簡單操作xml而不僅是依賴第三方工具包做瞭示范。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *