文章目錄
- (1)Document:是整個文檔的根結點。只有取得了Document結點,才能夠對文檔操作。
- (2)Node:DOM樹是由結點組成,因此結點是很重要的。
- (3)NodeList:是由Node組成的一個List。
- Javascript中運用DOM:把html想象成一個DOM樹。
對於XML進行解析,我們需要調用第三方提供的介面,對XML文檔進行解析;
對於XML處理方面,W3C有兩種解決方案:
(1)DOM(Document Object Model):
(2)SAX(Simple API for XML)
DOM介紹:
特點:先將xml文檔解析成dom樹,並放入記憶體,能夠隨機訪問任意節點。
缺點:因為需要放入記憶體操作,所以對檔案大小有限制。
DOM位於org.w3c.dom包中。
一、3個核心的介面:
介面所在包:
import javax.xml.transform.*;import javax.xml.transform.dom.*;import javax.xml.transform.stream.*;import javax.xml.parsers.*;import org.w3c.dom.*;(1)Document:是整個文檔的根結點。只有取得了Document結點,才能夠對文檔操作。
常用方法:
(1)Element elem = document.createElement("elem"); //建立一個結點
(2)Attribute attr = document.createAttribute("attr"); // 建立一個屬性
(3)Text t = document.createTextNode("text"); //建立一個文本節點
(4)NodeList list = document.getElementsByTagName("..."); //尋找某個結點
(2)Node:DOM樹是由結點組成,因此結點是很重要的。
常用方法:
(1)appendChild(Node child); //添加子節點
(2)getFirstChild(); //獲得第一個子節點
(3)getNodeValue(); //得到節點的值
(4)hasChildNodes(); //是否還有子節點
(3)NodeList:是由Node組成的一個List。
常用方法:
(1)Node item(int x); //獲得第幾個節點
(2)getLength(); // 獲得list的長度
如果要獲得Document對象,需要:
------------------------------------------------------------
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document doc = builder.parse("....");獲得doc |
------------------------------------------------------------
產生xml檔案方法:需要TransformerFactory,Transformer,StreamResult,DOMSource。
方法:
Document doc = builder.newDocument();
產生DOM樹 StreamResult result = new StreamResult(new File("...")); DOMSource source = new DOMSource(doc); TransformerFactory factory = TransformerFactory.newInstance(); Transformer t = factory.newTransformer(); t.transform(source,result);即可
|
<?xml version="1.0" encoding="GBK"?><persons><person><name>xiazdong</name><age>20</age><school>ecnu</school></person><person><name>xzdong</name><age>15</age><school>nanyang</school></person></persons>
讀取文檔資訊:
import org.w3c.dom.*;import javax.xml.parsers.*;public class DOMDemo01{public static void main(String args[])throws Exception{DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();DocumentBuilder builder = factory.newDocumentBuilder();Document doc = builder.parse("demo.xml");NodeList plist = doc.getElementsByTagName("person");for(int i=0;i<plist.getLength();i++){Element elem = (Element)plist.item(i);System.out.println("姓名:"+elem.getElementsByTagName("name").item(0).getFirstChild().getNodeValue());System.out.println("年齡:"+elem.getElementsByTagName("age").item(0).getFirstChild().getNodeValue());System.out.println("學校:"+elem.getElementsByTagName("school").item(0).getFirstChild().getNodeValue());}}}
產生XML文檔:
import org.w3c.dom.*;import javax.xml.parsers.*;import javax.xml.transform.*;import javax.xml.transform.dom.*;import javax.xml.transform.stream.*;import java.io.*;public class DOMDemo02{public static void main(String args[])throws Exception{DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();DocumentBuilder builder = factory.newDocumentBuilder();Document doc = builder.newDocument();Element person = doc.createElement("person");Element age = doc.createElement("age");Element name = doc.createElement("name");Text xiazdong = doc.createTextNode("xiazdong");Text ageText = doc.createTextNode("15");age.appendChild(ageText);name.appendChild(xiazdong);person.appendChild(name);person.appendChild(age);doc.appendChild(person);DOMSource source = new DOMSource(doc);TransformerFactory tf = TransformerFactory.newInstance();Transformer t = tf.newTransformer();StreamResult result = new StreamResult(new File("output.xml"));t.transform(source,result);}}
產生後xml文檔結構:
<?xml version="1.0" encoding="UTF-8" standalone="no"?><person><name>xiazdong</name><age>15</age></person>
SAX介紹:
只能讀取,不能產生或改變,並且只能遍曆。
缺點:只能讀取。
SAX的主要方法有5個:
(1)public void startDocument()throws SAXException;
(2)public void endDocument()throws SAXException;
(3)public void startElement(String uri,String localname,String name,Attribute attr)throws SAXException;
(4)public void endElement(String uri,String localname,String name)throws SAXException;
(5)public void characters(char[]ch , int start,int length)throws SAXException;
SAX屬於觸發類型的,當遇到文檔開頭就觸發(1)方法,遇到元素的開頭觸發(3)方法;
因此如果我們需要使用SAX,必須要自己實現一個SAX解析器;
注意:解析器必須繼承DefaultHandler;
實現完解析器後,則可以做操作:
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
parser.parse("檔案路徑",new MySAXParser());
即可;
XML解析工具:
(1)DOM4J
DOM4J是一個XML操作的包,為了提供給使用者更簡便的操作XML。
以下是產生一個XML檔案的代碼:
Document doc = DocumentHelper.createDocument(); Element name = doc.addElement("name"); Element first = name.addElement("firstname"); Element second = name.addElement("secondname"); first.setText("xia"); second.setText("second"); OutputFormat format = OutputFormat.createPrettyPrint(); format.setEncoding("gb2312"); XMLWriter writer = new XMLWriter(new FileOutputStream("out.xml"),format); writer.write(doc); writer.close(); |
以下是讀取一個XML檔案的代碼:
SAXReader reader = new SAXReader(); Document doc = reader.read(new File("out.xml")); Element root = doc.getRootElement(); Iterator iter = root.elementIterator(); Element elem = (Element)iter.next(); String str = elem.elementText("first"); |
(2)JDOM:也是一個非常好的解析工具,但是效能上比DOM4J差了不少,所以不用。
Javascript中運用DOM:把html想象成一個DOM樹。
這裡通過id進行尋找。
var elem = document.getElementById("id");
elem.innerHTML
產生一個<input type = "button" value = "button"/>過程:
var form = document.getElementById("form"); //獲得表單節點 Element button = document.createElement("input"); //建立一個節點 button.setAttribute("type","button"); //設定屬性 button.setAttribute("value","button"); //設定屬性 form.appendChild(button); //添加form的子節點 |