Dom和sax解析差別:
1.dom:(Document Object Model,文檔對象模型) W3C組織推薦的一種處理方式
sax:(Simple API for XML)不是官方标準,但它是XML社群事實上的标準,幾乎所有的XML解析
器都支援它。
2.使用Dom解析XML文檔時,需要讀取整個XML文檔,在記憶體中架構架構代表整個DOM樹的Document
對象,進而再對XML文檔進行操作。在此種情況下,如果xml文檔特别大,就會消耗計算機的大量
記憶體,并且容易導緻記憶體溢出。
SAX解析允許在操作讀取文檔的時候,即對文檔進行處理,而不必等到整個文檔加載完才會對
文檔進行操作。
-------------DOM4J---------------------------
1.Dom4j是一個簡單、靈活的開放源代碼的庫。Dom4j是由早期開發JDOM的人分離出來而後獨立開
發的。與JDOM不同的是,dom4j使用接口和抽象基類,雖然Dom4j的API相對要複雜一些,但它提
供了比JDOM更好的靈活性。
2.Dom4j是一個非常優秀的Java XML API,具有性能優異、功能強大和極易使用的特點。現在很
多軟體采用的Dom4j,例如Hibernate,包括sun公司自己的JAXM也用了Dom4j。
3.使用Dom4j開發,需下載下傳dom4j相應的jar檔案。
DOM4j中,獲得Document對象的方式有三種:
1.讀取XML檔案,獲得document對象
SAXReader reader = newSAXReader();
Document
document = reader.read(new File("input.xml“ ));
2.解析XML形式的文本,得到document對象.
String text = "<members></members>";
Document
document = DocumentHelper.parseText(text);
3.主動建立空document對象.
Document document = DocumentHelper.createDocument();
//建立根節點
Element root =document.addElement( "members");
元素Element操作:
//擷取文檔的元素.
Element root = document.getRootElement();
//擷取某個元素的指定名稱的第一個子節點.
Elementelement = element.element(“書名");
//擷取某個元素的指定名稱的所有子元素的集合
List list = element.elements(“書名”);
//添加一個指定名稱的子元素
Element childEle = parentEle.addElement(“書名”);
//删除某個元素指定的子元素
parentEle.remove(childEle);
屬性Attribute操作
//擷取某個元素的指定名稱的屬性對象
Attribute attr = element.attribute(“id”);
//擷取某個元素的指定名稱的屬性值
String id = element.attributeValue(“id”);
//給元素添加屬性或更新其值
Attribute attr =element.addAttribute(“id”,”123”);
//删除某個元素的指定屬性
element.remove(attribute);
文本Text的操作
//擷取某個元素的文本内容
String text = element.getText();
//給某個元素添加或更新文本内容
element.setText(“Tom”);
将文檔寫入XML檔案.
1.文檔中全為英文,不設定編碼,直接寫入的形式.
XMLWriter writer = new XMLWriter(new FileWriter("output.xml"));
writer.write(document);
writer.close();
2.文檔中含有中文,設定編碼格式寫入的形式.
OutputFormat format =OutputFormat.createPrettyPrint();// 指定XML編碼
format.setEncoding( “utf-8");
XMLWriter writer = new XMLWriter(newFileWriter( "output.xml“
),format);
writer.write(document);
writer.close();
Xpath介紹:
1. 在xml文檔中查找資訊的語言
2. 通過元素和屬性進行查找
3. 簡化Dom4j查找節點的過程
4. /students/student
5. 從根元素開始逐層找,以”/”開頭
6. //name
7. 直接擷取所有name元素對象,以“//”開頭
8. //student/*
9. 擷取所有student元素的所有子元素對象
10. //student[1]或//student[last()]
11. 擷取所有student元素的第一個或最後一個
12. //student[@id]
13. 擷取所有帶id屬性的student元素對象
14. //student[@id=‘002']
15. 擷取id等于002的student元素對象
l 擷取所有符合條件的節點
• document.selectNodes(StringxpathExpression)
傳回List集合
l 擷取符合條件的單個節點
• document.selectSingleNode(StringxpathExpression)
• 傳回一個Node對象。
• 如果符合條件的節點有多個,那麼傳回第一個。
------------SAX解析----------
SAX解析思想:解析器和事件處理器
1.解析器可以使用JAXP的API建立,建立出SAX解析器後,就可以指定解析器去解析某個XML文檔
2.解析器采用SAX方式在解析某個XML文檔時,它隻要解析到XML文檔的一個組成部分,都會調用
事件處理器的一個方法,解析器在調用事件處理器的方法時,就把目前解析到的xml的檔案内容
作為參數,傳遞給事件處理器。
3.程式員編寫事件處理器,通過事件處理器中方法的參數,得到解析的資料,對資料進行操作。
eg:
//1.建立解析工廠對象
SAXParserFactory factory=SAXParserFactory.newInstance();
//2.用工廠對象産生解析器對象
SAXParser parser= factory.newSAXParser();
//3.用解析器對象得到一個讀取器對象
XMLReader xmlReader=parser.getXMLReader();
//4.給讀取器設定一個處理器
xmlReader.setContentHandler(newMyContentHandler() );
//用解析器去讀取book.xml
xmlReader.parse("src\\cn\\itcast\\day02\\book.xml");
其中MyContentHandle繼承制DefaultHandler類,覆寫需要的方法:
1.startDocument()
2.endDocument()
3.startElemnet()
4.endElment();
5.characters();
其中得到屬性的方法:
attributes.getValue("方法名");
注:sax隻能用于讀取xml檔案,無法作更新
------------Dom解析-----------------
主要的概念:
Node:xml檔案所有對象的根接口 節點
Document:代表xml檔案的整個内容的對象的接口
Element:代表某個元素或标簽的對象的接口
Attr:代表某個元素的某個屬性對象的接口
Text:代表标簽體文本内容對象的接口
NodeList:代表包含多個Node接口對象的集合對象
可以對标簽進行增(create)删(Delete)改(update)查(read)----CRUD
讀:檢視所有的資料 有條件的查詢資料
寫入:将一個User對象的資訊儲存為一個user标簽
更新:建立一個有資料的user對象,根據其中的某個屬性資料值去找對應的user标簽,
将user對象的資料放到此user标簽中
删除:删除所有user标簽,有條件的删除:id=2删除對應的user标簽
操作的基本步驟:
1.加載xml檔案得到Document()
Document document = getDocument();
2.得到根标簽(uers标簽)
Element usersEle =document.getDocumentElement();
3.得到跟标簽的所有子标簽(得到Users标簽的所有子标簽,傳回一個NodeList)
NodeList nodeList =usersEle.getElementsByTagName("user");
4.周遊List進行操作。
for(int i=0;i<nodeList.getLength();i++){}
常用的方法:文檔解析器工廠---->解析器對象----->用解析器解析xml檔案得到Document對象
private Document getDocument() throwsParserConfigurationException,
SAXException,IOException {
//建立一個文檔解析器工廠對象
DocumentBuilderFactorybuilderFactory = DocumentBuilderFactory
.newInstance();
//根據工廠對象得到解析器對象password
DocumentBuilderbuilder = builderFactory.newDocumentBuilder();
//用解析器解析xml檔案得到Document對象
Documentdocument = builder.parse(new File(
"H:\\workspace\\day01\\src\\cn\\itcast\\dom\
\users.xml"));
returndocument;
}
儲存資訊: 思路:轉移器工廠對象---->通過工廠得到轉移器---->通過轉移器将Document的數
據轉移到檔案中去
private void saveDocument(Documentdocument)
throwsTransformerFactoryConfigurationError,
TransformerConfigurationException,TransformerException {
// 建立一個轉移器工廠對象
TransformerFactory factory =TransformerFactory.newInstance();
// 通過工廠對象得到一個轉移器
Transformer transformer =factory.newTransformer();
// 通過轉移器将Document的資料轉移到users.xml檔案中去
DOMSource xmlSource = newDOMSource(document);
StreamResultoutputTarget = new StreamResult(new File(
"H:\\workspace\\day01\\src\\cn\\itcast\\dom\
\users.xml"));
transformer.transform(xmlSource,outputTarget);
}
Node appendChild(newChild) 将新的節點添加為最後一個子節點
insertBefore(newChild,refChild) 在某個子節點前插入一個新子節點
removeChild(oldChild) 删除指定的某個子節點
replaceChild(newChild,oldChild) 将指定的子節點替換成新的子節點
setTextContent(textContent) 設定文本内容(一般用在元素對象上)
getNodeName() 得到節點名稱(一般用在元素對象上)
getParentNode() 得到父節點(一般用在元素對象上)
getTextContent() 得到文本内容(一般用在元素對象上)
getFirstChild() 得到第一個子節點
getLastChild() 得到最後一個子節點
getNextSibling() 得到下一個兄弟節點
getPreviousSibling() 得到上一個兄弟節點
Document
createElement(name) 建立一個指定名稱的标簽對象傳回
getDocumentElement() 得到xml檔案根标簽
getElementById(id) 根據id屬性值擷取一個子标簽對象
getElementsByTagName(name) 根據标簽名得到所有對應的子标簽
Element
setAttribute(name,value) 設定屬性的名稱和值
removeAttribute(attrName) 根據屬性名删除對應的屬性值
getAttribute(attrName) 根據屬性名得到相應的屬性值
getElementsByTagName(name) 根據标簽名得到對應的子标簽
getTagName() 得到标簽名
Attr、Text 極少直接操作這兩個接口的對象,一般通過Element對象來操作
NodeList getLength()得到包含的節點對象的個數 item(index)根據下标得到某個節點
轉自:http://blog.csdn.net/wd916913/article/details/8088033