xml解析之----DOM解析
阿新 • • 發佈:2017-06-29
dom模型 web margin java dom ext des ins api
節點轉換成對應的節點對象(Node的子類對象),以便於調用其特有的方法。
DOM模型(documentobject model) ?DOM解析器在解析XML文檔時,會把文檔中的全部元素。依照其出現的層次關系。解析成一個個Node對象(節點)。 ?在dom中。節點之間關系例如以下: ?位於一個節點之上的節點是該節點的父節點(parent) ?一個節點之下的節點是該節點的子節點(children) ?同一層次,具有同樣父節點的節點是兄弟節點(sibling) ?一個節點的下一個層次的節點集合是節點後代(descendant) 父、祖父節點 lNode對象提供了一系列常量來代表結點的類型,當開發者獲得某個Node類型後,就能夠把Node
(查看
API文檔) lNode對象提供了對應的方法去獲得它的父結點或子結點。編程人員通過這些方法就能夠讀取整個XML文檔的內容、或加入、改動、刪除XML文檔的內容了。
首先引出要解析的xml文件:
<?xml version="1.0" encoding="UTF-8"?
><書架> <書> <書名>javaweb開發</書名> <作者 id="12">張孝祥</作者> <售價>59元</售價> </書> <書> <書名>JavaScript網頁開發</書名> <作者>張孝祥</作者> <售價>28.00元</售價> </書> </書架>
下面即是對xml的增刪改查操作:
import java.io.FileOutputStream; 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.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import org.junit.Before; 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; public class Demo3 { /** * 利用dom完畢文檔的crud * @param args * @throws Exception * @throws ParserConfigurationException * @throws Exception * @throws SAXException * @throws Exception */ private Document document; @Before public void before() throws Exception{ //獲得dom解析工廠類 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); //得到dom解析器 DocumentBuilder builder = factory.newDocumentBuilder(); //解析xml文件 document = builder.parse("src/book.xml"); } //遍歷 @Test public void listXml() throws ParserConfigurationException, SAXException, Exception{ list(document); } public void list(Node node){ //打印結點的名稱 System.out.println(node.getNodeName()); //獲得全部子節點 NodeList list = node.getChildNodes(); for(int i=0;i<list.getLength();i++){ Node child = list.item(i); //遞歸整個dom樹 list(child); } } //讀取書名節點的值:<書名>javaweb開發</書名> @Test public void test1(){ Document document = this.document; Node node = document.getElementsByTagName("書名").item(0); String value = node.getTextContent(); System.out.println(value); } //讀取書名屬性的值:<售價 type="rmb">39.00元</售價> @Test public void test2(){ Document document = this.document; Node node = document.getElementsByTagName("售價").item(0); Element price = (Element) node; //發現node滿足不了。把node強轉成對應類型 String attValue = price.getAttribute("type"); System.out.println(attValue); } //向xml文檔中加入售價節點 @Test public void test3() throws Exception{ Document document = this.document; //創建要掛的節點 Element price = document.createElement("售價"); price.setTextContent("59元"); //把創建的結點掛到書節點下 Node book = document.getElementsByTagName("書").item(0); book.appendChild(price); //把內存中更新後對象樹,又一次定回到xml文檔中 TransformerFactory factory = TransformerFactory.newInstance(); Transformer tf = factory.newTransformer(); tf.transform(new DOMSource(document), new StreamResult(new FileOutputStream("src/book.xml"))); } //向xml文檔中指定位置上加入售價節點 @Test public void test4() throws Exception{ Document document = this.document; //創建要加入的節點 Element price = document.createElement("售價"); price.setTextContent("59元"); //得到要向哪個節點上掛子節點 Node book = document.getElementsByTagName("書").item(0); //向參考節點前,掛新節點 book.insertBefore(price, document.getElementsByTagName("售價").item(0)); //把內存中更新後對象樹,又一次定回到xml文檔中 TransformerFactory factory = TransformerFactory.newInstance(); Transformer tf = factory.newTransformer(); tf.transform(new DOMSource(document), new StreamResult(new FileOutputStream("src/book.xml"))); } //向xml文檔加入節點屬性 @Test public void test5() throws Exception{ Document document = this.document; //得到要加入屬性的節點 Element author = (Element) document.getElementsByTagName("作者").item(0); author.setAttribute("id", "12"); //向節點掛屬性 //把內存中更新後對象樹,又一次定回到xml文檔中 TransformerFactory factory = TransformerFactory.newInstance(); Transformer tf = factory.newTransformer(); tf.transform(new DOMSource(document), new StreamResult(new FileOutputStream("src/book.xml"))); } //刪除xml文檔中的售價節點 @Test public void test6() throws Exception{ Document document = this.document; //得到要刪除的節點 Node price = document.getElementsByTagName("售價").item(0); //得到要刪除的節點的父親 Node parent = document.getElementsByTagName("書").item(0); parent.removeChild(price); //把內存中更新後對象樹,又一次定回到xml文檔中 TransformerFactory factory = TransformerFactory.newInstance(); Transformer tf = factory.newTransformer(); tf.transform(new DOMSource(document), new StreamResult(new FileOutputStream("src/book.xml"))); } //刪除2 : 刪除售價節點所在的書結點 @Test public void test7() throws Exception{ Document document = this.document; //得到要刪除的節點 Node price = document.getElementsByTagName("售價").item(0); price.getParentNode().getParentNode().removeChild(price.getParentNode()); //把內存中更新後對象樹。又一次定回到xml文檔中 TransformerFactory factory = TransformerFactory.newInstance(); Transformer tf = factory.newTransformer(); tf.transform(new DOMSource(document), new StreamResult(new FileOutputStream("src/book.xml"))); } @Test public void test8() throws Exception{ Document document = this.document; document.getElementsByTagName("售價").item(1).setTextContent("19元"); //把內存中更新後對象樹。又一次定回到xml文檔中 TransformerFactory factory = TransformerFactory.newInstance(); Transformer tf = factory.newTransformer(); tf.transform(new DOMSource(document), new StreamResult(new FileOutputStream("src/book.xml"))); } }
xml解析之----DOM解析