JAXP操作xml
轉載自? ?JAXP操作xml
DOM對象詳解
1.基本的DOM對象
DOM的基本對象有5個:Document,Node,NodeList,Element和Attr。下面就這些對象的功能和實現的方法作一個大致的介紹。
Document 對象代表了整個XML的文檔,所有其它的Node,都以一定的順序包含在Document對象之內,排列成一個樹形的結構,程序員可以通過遍歷這顆樹來得 到XML文檔的所有的內容,這也是對XML文檔操作的起點。我們總是先通過解析XML源文件而得到一個Document對象,然后再來執行后續的操作。此 外,Document還包含了創建其它節點的方法,比如createAttribut()用來創建一個Attr對象。它所包含的主要的方法有:
createAttribute(String):用給定的屬性名創建一個Attr對象,并可在其后使用setAttributeNode方法來放置在某一個Element對象上面。
createElement(String):用給定的標簽名創建一個Element對象,代表XML文檔中的一個標簽,然后就可以在這個Element對象上添加屬性或進行其它的操作。
createTextNode(String):用給定的字符串創建一個Text對象,Text對象代表了標簽或者屬性中所包含的純文本字符串。如果在一個標簽內沒有其它的標簽,那么標簽內的文本所代表的Text對象是這個Element對象的唯一子對象。
getElementsByTagName(String):返回一個NodeList對象,它包含了所有給定標簽名字的標簽。
getDocumentElement():返回一個代表這個DOM樹的根節點的Element對象,也就是代表XML文檔根元素的那個對象。
Node 對象是DOM結構中最為基本的對象,代表了文檔樹中的一個抽象的節點。在實際使用的時候,很少會真正的用到Node這個對象,而是用到諸如 Element、Attr、Text等Node對象的子對象來操作文檔。Node對象為這些對象提供了一個抽象的、公共的根。雖然在Node對象中定義了 對其子節點進行存取的方法,但是有一些Node子對象,比如Text對象,它并不存在子節點,這一點是要注意的。Node對象所包含的主要的方法有:
appendChild(org.w3c.dom.Node):為這個節點添加一個子節點,并放在所有子節點的最后,如果這個子節點已經存在,則先把它刪掉再添加進去。
getFirstChild():如果節點存在子節點,則返回第一個子節點,對等的,還有getLastChild()方法返回最后一個子節點。
getNextSibling():返回在DOM樹中這個節點的下一個兄弟節點,對等的,還有getPreviousSibling()方法返回其前一個兄弟節點。
getNodeName():根據節點的類型返回節點的名稱。
getNodeType():返回節點的類型。
getNodeValue():返回節點的值。
hasChildNodes():判斷是不是存在有子節點。
hasAttributes():判斷這個節點是否存在有屬性。
getOwnerDocument():返回節點所處的Document對象。
insertBefore(org.w3c.dom.Node new,org.w3c.dom.Node ref):在給定的一個子對象前再插入一個子對象。
removeChild(org.w3c.dom.Node):刪除給定的子節點對象。
replaceChild(org.w3c.dom.Node new,org.w3c.dom.Node old):用一個新的Node對象代替給定的子節點對象。
NodeList對象,顧名思義,就是代表了一個包含了一個或者多個Node的列表。可以簡單的把它看成一個Node的數組,我們可以通過方法來獲得列表中的元素:
GetLength():返回列表的長度。
Item(int):返回指定位置的Node對象。
Element對象代表的是XML文檔中的標簽元素,繼承于Node,亦是Node的最主要的子對象。在標簽中可以包含有屬性,因而Element對象中有存取其屬性的方法,而任何Node中定義的方法,也可以用在Element對象上面。
getElementsByTagName(String):返回一個NodeList對象,它包含了在這個標簽中其下的子孫節點中具有給定標簽名字的標簽。
getTagName():返回一個代表這個標簽名字的字符串。
getAttribute(String): 返回標簽中給定屬性名稱的屬性的值。在這兒需要主要的是,應為XML文檔中允許有實體屬性出現,而這個方法對這些實體屬性并不適用。這時候需要用到 getAttributeNodes()方法來得到一個Attr對象來進行進一步的操作。
getAttributeNode(String):返回一個代表給定屬性名稱的Attr對象。
Attr 對象代表了某個標簽中的屬性。Attr繼承于Node,但是因為Attr實際上是包含在Element中的,它并不能被看作是Element的子對象,因 而在DOM中Attr并不是DOM樹的一部分,所以Node中的getparentNode(),getdivviousSibling()和 getnextSibling()返回的都將是null。也就是說,Attr其實是被看作包含它的Element對象的一部分,它并不作為DOM樹中單獨 的一個節點出現。這一點在使用的時候要同其它的Node子對象相區別。
需要說明的是,上面所說的DOM對象在DOM中都是用接口定義的, DOM其實可以在任何面向對象的語言中實現,只要它實現了DOM所定義的接口和功能就可以了。
2,關于JAXP包
JAXP 開發包是J2SE的一部分,它由javax.xml、org.w3c.dom 、org.xml.sax 包及其子包組成
在 javax.xml.parsers 包中,定義了幾個工廠類,程序員調用這些工廠類,可以得到對xml文檔進行解析的 DOM 或 SAX 的解析器對象。
使用JAXP進行DOM解析
javax.xml.parsers包中的DocumentBuilderFactory用于創建DOM模式的解析器對象 , DocumentBuilderFactory是一個抽象工廠類,它不能直接實例化,但該類提供了一個newInstance方法 ,這個方法會根據本地平臺默認安裝的解析器,自動創建一個工廠的對象并返回。
獲得JAXP中的DOM解析器
調用 DocumentBuilderFactory.newInstance() 方法得到創建 DOM 解析器的工廠。
調用工廠對象的 newDocumentBuilder方法得到 DOM 解析器對象。
調用 DOM 解析器對象的 parse()方法解析 XML 文檔,得到代表整個文檔的 Document 對象,進行可以利用DOM特性對整個XML文檔進行操作了。
更新XML文檔
?
javax.xml.transform包中的Transformer類用于把代表XML文件的Document對象轉換為某種格式后進行輸出,例如把xml文件應用樣式表后轉成一個html文檔。利用這個對象,當然也可以把Document對象又重新寫入到一個XML文件中。
Transformer類通過transform方法完成轉換操作,該方法接收一個源和一個目的地。我們可以通過:
?????????javax.xml.transform.dom.DOMSource類來關聯要轉換的document對象,
?????????用javax.xml.transform.stream.StreamResult 對象來表示數據的目的地。
?Transformer對象通過TransformerFactory獲得。
看一個簡單示例:
Book.xml
<?xmlversion="1.0"encoding="UTF-8"standalone="no"?> <book> <bookname>Java程序設計</bookname> <bookprice>40元</bookprice> <author>lijizh</author> <publisher>lijizh1013</publisher> </book>Dom.java
package dtd;import java.io.IOException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; importjavax.xml.parsers.ParserConfigurationException;import org.w3c.dom.Document; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.SAXException;publicclass Dom {publicstaticvoid main(String[] args) throws ParserConfigurationException,SAXException, IOException {//獲取解析工廠DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();//創建解析器對象DocumentBuilder db = dbf.newDocumentBuilder();//獲取Document對象Document d = db.parse("src/dtd/Book.xml");//通過Document對象的方法獲取相應的節點列表NodeList nl = d.getElementsByTagName("bookname");//獲取指定節點Node node = nl.item(0);//獲取指定節點內容String content = node.getTextContent();//輸出內容System.out.println(content);} }示例完成對XML文件的CRUD操作:
Book.xml
<?xmlversion="1.0"encoding="UTF-8"standalone="no"?> <book> <bookname>Java程序設計</bookname> <bookprice>40元</bookprice> <author>lijizh</author> <publisher>lijizh1013</publisher> </book>ReadDom.java
package dtd;import java.io.IOException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerConfigurationException; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult;import org.junit.Test; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.SAXException;publicclass ReadDom {@Testpublicvoid read() throws ParserConfigurationException, SAXException, IOException{DocumentBuilderFactoryfactory = DocumentBuilderFactory.newInstance();DocumentBuilder db =factory.newDocumentBuilder();Document d = db.parse("src/dtd/Book.xml");Node node = d.getElementsByTagName("book").item(0);// System.out.println(node.getNodeName());list(node); }//用此方法遍歷元素節點 private void list(Node node) {if(node instanceof Element){System.out.println(node.getNodeName());}NodeList list = node.getChildNodes();for(int i = 0;i< list.getLength();i++){Node node1 =list.item(i);list(node1);}}@Test//以尾部追加的方式向XML文件中增添數據的方法public void insert() throws ParserConfigurationException, SAXException,IOException, TransformerException{DocumentBuilderFactory factory =DocumentBuilderFactory.newInstance();DocumentBuilderdb = factory.newDocumentBuilder();Document d = db.parse("src/dtd/Book.xml"); Element node = (Element)d.getElementsByTagName("book").item(0);Element newNode =d.createElement("color");newNode.setTextContent("red");node.appendChild(newNode);//通過轉換工廠的newInstance()方法獲取工廠實例TransformerFactory tff =TransformerFactory.newInstance();//獲取轉換器Transformer tf =tff.newTransformer();//通過轉換器對象的transform方法將源與目標文件相連接tf.transform(new DOMSource(d),new StreamResult("src/dtd/Book.xml")); }@Test//以向前插入的方式向XML文件中增添數據的方法publicvoid insert1() throws ParserConfigurationException, SAXException, IOException,TransformerException{DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();DocumentBuilder db = factory.newDocumentBuilder();Document d = db.parse("src/dtd/Book.xml");Element node = (Element)d.getElementsByTagName("book").item(0);Element newNode = d.createElement("publisher");newNode.setTextContent("lijizh");Element refChild = (Element)d.getElementsByTagName("color").item(0);node.insertBefore(newNode, refChild);TransformerFactory tff = TransformerFactory.newInstance();Transformer tf = tff.newTransformer();tf.transform(new DOMSource(d),new StreamResult("src/dtd/Book.xml"));}@Test//從XML文件中刪除數據的方法publicvoid delete() throws ParserConfigurationException, SAXException, IOException,TransformerException{DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();DocumentBuilder db = factory.newDocumentBuilder();Document d = db.parse("src/dtd/Book.xml");Element node = (Element)d.getElementsByTagName("color").item(0);Element parent =(Element)node.getParentNode();parent.removeChild(node);TransformerFactory tff = TransformerFactory.newInstance();Transformer tf = tff.newTransformer();tf.transform(new DOMSource(d),new StreamResult("src/dtd/Book.xml"));}@Test從XML文件中更新數據的方法publicvoid update() throws ParserConfigurationException, SAXException, IOException,TransformerException{DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();DocumentBuilder db = factory.newDocumentBuilder();Document d = db.parse("src/dtd/Book.xml");Element node = (Element)d.getElementsByTagName("publisher").item(0);node.setTextContent("lijizh1013"); TransformerFactory tff = TransformerFactory.newInstance();Transformer tf = tff.newTransformer();tf.transform(new DOMSource(d),new StreamResult("src/dtd/Book.xml"));}}}總結
- 上一篇: 谈谈Memcached与Redis
- 下一篇: Go语言、Docker 和新技术