Java中的的XML文件讀寫與DOM


 

XML簡介

要理解XML,HTML等格式,先來理解文檔對象模型DOM

  

根據 DOM,HTML 文檔中的每個成分都是一個節點,這些節點組成了一棵樹。
DOM 是這樣規定的:
整個文檔是一個文檔節點
每個 HTML 標簽是一個元素節點
包含在 HTML 元素中的文本是文本節點
每一個 HTML 屬性是一個屬性節點
注釋屬於注釋節點

節點彼此都有等級關系。HTML 文檔中的所有節點組成了一個文檔樹(或節點樹)。HTML 文檔中的每個元素、屬性、文本等都代表着樹中的一個節點。樹起始於文檔節點,並由此繼續伸出枝條,直到處於這棵樹最低級別的所有文本節點為止。

 

讀取xml文件:

public static void getFamilyMemebers(){
        DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
        dbf.setIgnoringElementContentWhitespace(true);
        try {
            DocumentBuilder db = dbf.newDocumentBuilder();
            Document doc = db.parse(xmlPath); // 使用dom解析xml文件

            NodeList sonlist = doc.getElementsByTagName("son"); 
            for (int i = 0; i < sonlist.getLength(); i++) // 循環處理對象
            {
                Element son = (Element)sonlist.item(i);;
                
                for (Node node = son.getFirstChild(); node != null; node = node.getNextSibling()){  
                    if (node.getNodeType() == Node.ELEMENT_NODE){  
                        String name = node.getNodeName();  
                        String value = node.getFirstChild().getNodeValue();  
                        System.out.println(name+" : "+value);
                    }  
                }  
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

  注意到 factory 可以生成 builder,builder可以生成document,document可以生成特定名稱的node 組成的nodeList,nodeList中的每個node可以轉換成element,element可以返回node形式的兒子,node形式的元素可以獲得它的屬性。

 

    現在,你能不能將xml的格式還原出來呢?其實並不難,注意xml文檔實際上和html文檔類似,只不過html文檔定義了豐富標簽而已。我們把每個元素與屏幕上一個div相對應,這樣就可以用圖形方便的表示xml結構了。

 

現在如果要解析下面的xml:

<?xml version="1.0" encoding="GB2312" ?> 
<Root>
<Header left="100" Top="30">日報表</Header> 
</Root>

可以使用代碼:

import java.io.File;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

public class Xml {
 public static void main(String[] args) {
  try {
   DocumentBuilderFactory factory = DocumentBuilderFactory
     .newInstance();
   DocumentBuilder builder = factory.newDocumentBuilder();
   Document document = builder.parse(new File("file.xml"));
   Element rootElement = document.getDocumentElement();

   NodeList list = rootElement.getElementsByTagName("Header");
   Element element = (Element) list.item(0);
   System.out.println(element.getChildNodes().item(0).getNodeValue());

  } catch (Exception e) {
   System.out.println("exception:" + e.getMessage());
  }
 }
}

 

 

寫XML文件

 

public static void createSon() {
        DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
        dbf.setIgnoringElementContentWhitespace(false);
        
        try{
        
            DocumentBuilder db=dbf.newDocumentBuilder();
            Document xmldoc=db.parse(xmlPath);
        
            Element root = xmldoc.getDocumentElement();
            
            //刪除指定節點
            
            Element son =xmldoc.createElement("son");
            son.setAttribute("id", "004");
            
            Element name = xmldoc.createElement("name");
            name.setTextContent("小兒子");
            son.appendChild(name);

            Element age = xmldoc.createElement("name");
            age.setTextContent("0");
            son.appendChild(age);
            
            root.appendChild(son);
            //保存
            TransformerFactory factory = TransformerFactory.newInstance();
            Transformer former = factory.newTransformer();
            former.transform(new DOMSource(xmldoc), new StreamResult(new File(xmlPath)));
            
        }catch(Exception e){
            e.printStackTrace();
        }
    }

 

與JSON格式的對比

  JSON格式包含有兩種結構: 這兩種結構就是對象和數組兩種結構,通過這兩種結構可以表示各種復雜的結構

  1、對象:對象在js中表示為“{}”括起來的內容引用了一個對象,數據結構為 {key:value,key:value,...}的鍵值對的結構,在面向對象的語言中,key為對象的屬性,value為對應的屬性值,所以很容易理解,取值方法為 對象.key 獲取屬性值,這個屬性值的類型可以是 數字、字符串、數組、對象幾種。
  2、數組:數組在js中是中括號“[]”括起來的內容引用了一個數組,數據結構為 ["java","javascript","vb",...],取值方式和所有語言中一樣,使用索引獲取,字段值的類型可以是 數字、字符串、數組、對象幾種。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM