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",...],取值方式和所有語言中一樣,使用索引獲取,字段值的類型可以是 數字、字符串、數組、對象幾種。