生活随笔
收集整理的這篇文章主要介紹了
xml解析之dom、dom4j、SAX
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、XML:
1、概念:可擴展標記語言,標簽都是自定義的,就是一個記錄,不需要編譯
2、xml與html的區別:
1、html標簽是預編譯的,xml標簽是自由發揮的
2、html主要是用于頁面展示,xml拿來存數據的
3、html5也是目前跨平臺開發的一個比較火的,它是html4+xml延伸出來的
3、基本結構:
1、第一行都是聲明xml的信息,版本之間區別挺大的,使用時要注意。
2、下面部分就是文檔的描述,例如有:元素節點(),屬性節點id,文本節點
4、總結xml標簽的語法注意:
1、必須有根節點
2、xml元素必須有結束標簽
3、對大小寫敏感
4、必須正確嵌套
5、同級標簽縮進對齊
6、元素名稱遵循駝峰命名(不能有空格)
5、xml解析器:
1、驗證解析器:
1、主要為了檢查dtd文件,(就相當于導包),例如mybaties框架哪些網址后綴都有dtd的,自己留意下
2、非驗證解析器:專門檢查xml語法
6、xml命名空間:(就是同一個xml文件避免出現同名的根標簽,注意是根元素)
1、用前綴解決這種命名沖突,例如(f:books)
7、解析xml:
1、把它轉化成一個dom對象,dom解析(還有其他的解析方法,dom4j解析(就是對dom的封裝)、sax解析(主要用于移動端解析))
二、dom解析應用:
1、把xml文件轉換成dom對象的步驟:
1、得到解析器工廠對象:DocumentBuilderFactory.newInstance();
2、得到真正的解析器對象:dbf.newDocumentBuilder();
3、得到xml文件的路徑:File file=new File(“src/xml名字.xml”);
4、把文件轉換成dom對象:doc=db.parse(file);//返回值就是Document對象doc
2、得到Brand標簽的屬性值以及其子類標簽的屬性值:1、得到標簽名為Brand的集合:doc.getElementByTargetName("Brand");2、遍歷上面那個集合:有點不一樣是用集合.getLength()得到集合長度3、然后再遍歷里面得到每一個Brand的具體節點:Node node=集合.item(i);4、然后將內個具體節點強轉轉為標簽節點:Element eleName=(Element) node;5、輸出標簽名屬性為name的屬性值:String str=eleName.getAttribute("name");6、輸出即可。3、 刪除一條屬性name是三星的Brand標簽:1、得到Brand標簽集合:doc.getElementByTargetName("Brand");2、for循環遍歷得到的集合:注意用listBrand.getLength();3、得到具體Brand的節點:listBrand.item(i);//得到一個obj對象4、強轉節點為標簽節點:Element eleBrand=(Element) obj;5、判斷標簽節點的屬性name的值是否等于三星:if(eleBrand.getAttribute("name").equals("三星"));6、是就刪除:eleBrand.getParentNode().removeChild(eleBrand);4、增加一條屬性為name="華為"Brand標簽,里面還有一個子標簽type,屬性為name="華為note3":1、創建一個Brand標簽:doc.createElement("Brand");2、創建一個type標簽:doc.createElement("type");3、給Brand標簽添加屬性以及值:eleBrand.setAttribute("name","華為");4、給type標簽添加屬性以及值:eleType.setAttribute("name","華為note3");5、將type標簽放到Brand標簽中:eleBrand.appendChild(eleType);6、將整個Brand標簽放到根標簽里:doc.getElementByTargetName("phone").item(0).appendChild(eleBrand);5、給所有Brand標簽增加一個屬性id,而且有值:1、得到Brand標簽集合:doc.getElementByTargetName("Brand");2、for循環遍歷得到的集合:注意用listBrand.getLength();3、得到具體Brand的節點:listBrand.item(i);//得到一個obj對象4、強轉節點為標簽節點:Element eleBrand=(Element) obj;5、eleBrand.setAttribute("id",i+1+"");6、將新內容寫入xml文件:public void writeXml(String path){//得到一個轉換器工廠對象TransformerFactory tsf=TransformerFactory.newInstance();//得到轉換器對象Transformer ts=tsf.newTransformer();//設置轉換器格式為utf-8ts.setOutputProperty(OutputKeys.ENCODING,"utf-8");//得到DOMSource對象,參數是DOM對象docDOMSource ds=new DOMSource();//得到ResultStream對象ResultStream rs=new ResultStream(new OutputStreamWriter(new FileOutputStream(path),"utf-8"));//利用transform方法進行轉換,第一個參數是DOMSource對象,第二個是ResultStream對象ts.transform(ds,rs);}
三、dom4j的使用:(其實就是dom封裝好的框架)
前戲導入dom4j包
1、得到DOM對象:
1、SAXReader sr=new SAXReader();2、doc=sr.read(new File("src/phone.xml"));2、得到Brand標簽的屬性值以及其子類標簽的屬性值:1、得到根節點:Element rootEle=doc.getRootElement();2、利用根節點得到標簽迭代器:Iterator rootIterator=rootEle.elementIterator();3、while循環4、得到Brand節點對象:Object obj=rootIterator.next();5、強轉為標簽節點:Element brandEle=(Element) obj;6、得到屬性值:String value=ele.attributeValue("name");//輸出即可7、通過Brand標簽節點得到迭代器:Iterator brandIterator=rootEle.elementIterator();8、while循環9、得到所有Brand下的節點:Object obj2=brandIterator.next();10、強轉為標簽節點:Element brandEle=(Element) obj2;11、得到屬性值:String value2=ele.attributeValue("name");//輸出即可3、添加新的標簽student1、得到根節點: Element rootEle=doc.getRootElement();2、直接添加新標簽:Element studentEle=rootEle.addElelment("student");3、給新標簽添加屬性:studentEle.setAttributeValue("name","Sandy");//多個就寫多幾個就可以了4、給原有的所有student添加一個id屬性1、得到根節點:Element rootEle=doc.getRootElement(); 2、得到迭代器:Iterator rootIte=rootEle.elementIterator();3、while循環4、得到每個節點對象:Object obj=rootIte.next();5、強轉為標簽節點:Element ele=(Element) obj; 6、添加屬性以及值:ele.setAttributeValue("id",num+"");//這里num靠上幾步的num++可以得到1、2、3 5、將新DOM對象寫入xml文件:1、得到opf對象:OutputFormat opf=OutputFormat.createOutputFprmat();2、設置輸出格式:opf.setEconding("utf-8");3、利用核心XMLWriter xw=new XMLWriter(new FileOutputStream(new File(path),opf));//這里的path是靠傳參進來的,opf對象在上面想辦法搞出來4、可以把新DOM讀到指定xml文件:xw.write(doc);
總結
以上是生活随笔為你收集整理的xml解析之dom、dom4j、SAX的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。