用DOM解析XML
二、XML解析 有兩種解析方法:DOM(document object model)解析與SAX(simple API for XML)解析 XML解析開發(fā)包: ?JAXP:是SUN公司推出的解析標(biāo)準(zhǔn)實(shí)現(xiàn)。 ?Dom4J:是開源組織推出的解析開發(fā)包。 ?JDom:是開源組織推出的解析開發(fā)包。 JAXP(java API for XML processing)是javaSE的一部分,由三個(gè)子包組成 ?org.w3c.dom:提供DOM方式解析XML的標(biāo)準(zhǔn)接口 ?org.xml.sax:提供SAX方式解析XML的標(biāo)準(zhǔn)接口 ?javax.xml:提供了解析XML文檔的類 javax.xml.parsers包中,定義了幾個(gè)工廠類。我們可以通過調(diào)用這些工廠類,得到對XML文檔進(jìn)行解析的DOM和SAX解析器對象。 ?DocumentBuilderFactory ?SAXParserFactory
先看一下我們要解析的XML文檔,文件名為books.xml <?xml version="1.0" encoding="utf-8"?> <書架><書><書名>浪潮之巔</書名> <作者>吳軍</作者><售價(jià)>39.00元</售價(jià)></書><書><書名>數(shù)學(xué)之美</書名><作者>吳軍</作者><售價(jià)>28.00元</售價(jià)></書></書架>
第二個(gè)例子 xml文檔名為exam.xml <?xml version="1.0" encoding="UTF-8" standalone="no"?> <exam><student idcard="111" examid="222"><name>張三</name><location>沈陽</location><grade>89</grade></student><student idcard="333" examid="444"><name>李四</name><location>大連</location><grade>97</grade></student> </exam> 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.w3c.dom.Attr; 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 ExamXML {public static void main(String[] args) {//1. 向該xml文檔里添加一個(gè)用戶,姓名:王五,;location:鐵嶺;grade:99DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();try {DocumentBuilder documentBuilder=documentBuilderFactory.newDocumentBuilder();//拿到dom樹Document document=documentBuilder.parse("exam.xml");//拿到父節(jié)點(diǎn)Node superNode = document.getElementsByTagName("exam").item(0);Element studentElement=document.createElement("student");Element nameElement=document.createElement("name");Element locationElement=document.createElement("location");Element gradeElement=document.createElement("grade");nameElement.setTextContent("王五");locationElement.setTextContent("鐵嶺");gradeElement.setTextContent("99");studentElement.appendChild(nameElement);studentElement.appendChild(locationElement);studentElement.appendChild(gradeElement);superNode.appendChild(studentElement);NodeList WangwuInfo=document.getElementsByTagName("student").item(2).getChildNodes();for (int i = 0; i < WangwuInfo.getLength(); i++) {if (WangwuInfo.item(i).getNodeType()==1) {System.out.println("第"+i+"個(gè)標(biāo)簽內(nèi)的文本是:"+WangwuInfo.item(i).getTextContent());} }//=========================================================================================//2. 給每個(gè)學(xué)生增加一條信息,性別 NodeList studentList=document.getElementsByTagName("student");for (int i = 0; i < studentList.getLength(); i++) {Element gender=document.createElement("性別");studentList.item(i).appendChild(gender);}System.out.println("給每個(gè)學(xué)生增加性別標(biāo)簽,共有"+document.getElementsByTagName("性別").getLength()+"個(gè)學(xué)生增加");//==================================================================================//3. 刪除第一個(gè)學(xué)生張三的所有信息。Node zhangsan=document.getElementsByTagName("student").item(0);superNode.removeChild(zhangsan);System.out.println("刪除了張三后的學(xué)生標(biāo)簽有:"+studentList.getLength());//======================================================================================//4. 將第二個(gè)學(xué)生李四的姓名改為 李四光Node lisiInfo=document.getElementsByTagName("student").item(0);String lisiName=lisiInfo.getChildNodes().item(1).getTextContent();System.out.println("李四更改名字之前:"+lisiName);lisiInfo.getChildNodes().item(1).setTextContent("李四光");System.out.println("更改名字之后"+lisiInfo.getChildNodes().item(1).getTextContent());//=========================================================================================//5. 給每個(gè)學(xué)生增加一個(gè)ID屬性//增加屬性是元素對象的方法,故從Node強(qiáng)轉(zhuǎn)為element類型for (int i = 0; i < studentList.getLength(); i++) {Attr idAttr=document.createAttribute("id");Element element=(Element) studentList.item(i);element.setAttributeNode(idAttr);} //強(qiáng)轉(zhuǎn)Element element=(Element) studentList.item(0);//設(shè)置屬性element.setAttribute("id", "1234");//打印屬性System.out.println("id:"+element.getAttribute("id"));Element element1=(Element) studentList.item(1);element1.setAttribute("id", "98765");System.out.println("id:"+element1.getAttribute("id"));//存盤操作TransformerFactory tsf =TransformerFactory.newInstance();Transformer tsTransformer = tsf.newTransformer();tsTransformer.transform(new DOMSource(document), new StreamResult("src/Exam.xml"));} catch (ParserConfigurationException e) {e.printStackTrace();} catch (SAXException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} catch (TransformerConfigurationException e) {e.printStackTrace();} catch (TransformerException e) {e.printStackTrace();}} }
先看一下我們要解析的XML文檔,文件名為books.xml <?xml version="1.0" encoding="utf-8"?> <書架><書><書名>浪潮之巔</書名> <作者>吳軍</作者><售價(jià)>39.00元</售價(jià)></書><書><書名>數(shù)學(xué)之美</書名><作者>吳軍</作者><售價(jià)>28.00元</售價(jià)></書></書架>
?
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.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 ParseXml {public static void main(String[] args) {//多態(tài),返回的是內(nèi)部實(shí)現(xiàn)的一個(gè)子類的實(shí)例DocumentBuilderFactory documentBuilderFactory=DocumentBuilderFactory.newInstance();try {//多態(tài)DocumentBuilder documentBuilder= documentBuilderFactory.newDocumentBuilder();//拿到文檔對象模型,DOM樹Document document=documentBuilder.parse("Books.xml");//從DOM樹中取出標(biāo)簽名,返回一個(gè)結(jié)點(diǎn)listNodeList nodeList=document.getElementsByTagName("書");//取出下標(biāo)為0的結(jié)點(diǎn)Node booksName0=nodeList.item(0);//取得結(jié)點(diǎn)的結(jié)點(diǎn)名稱String name=booksName0.getNodeName();//取得該節(jié)點(diǎn)的父節(jié)點(diǎn),返回一個(gè)結(jié)點(diǎn)node,調(diào)用getNodeName方法返回字符串String parentName=booksName0.getParentNode().getNodeName();System.out.println("結(jié)點(diǎn)名稱:<"+name+">,父節(jié)點(diǎn):<"+parentName+">");//===================================================================//二、打印某節(jié)點(diǎn)的所有元素節(jié)點(diǎn) ,用第二個(gè)書結(jié)點(diǎn)Node bookname1=nodeList.item(1);NodeList childNodesList=bookname1.getChildNodes();int listLength=childNodesList.getLength();for (int i = 0; i < listLength; i++) {//因?yàn)閄ML中的空格換行等也屬于子節(jié)點(diǎn),故找到結(jié)點(diǎn)類型為1-->即元素,才打印if (childNodesList.item(i).getNodeType()==1) {String nodeName=childNodesList.item(i).getNodeName();System.out.println("第"+i+"個(gè)子節(jié)點(diǎn)<"+nodeName+">");}} // ========================================================================= // 三、修改某個(gè)元素結(jié)點(diǎn)的主體內(nèi)容--->將"數(shù)學(xué)之美"改為"編程之美" // 從子節(jié)點(diǎn)list中得到書名元素,用getTextContentString book2=childNodesList.item(1).getTextContent();System.out.println("更改之前的書名:"+book2);childNodesList.item(1).setTextContent("編程之美");System.out.println("更改之前的書名:"+childNodesList.item(1).getTextContent());//注意,更改了名字只是保存在內(nèi)存中,并未保存到原文件中// ========================================================================= // 四、向指定元素節(jié)點(diǎn)中增加子元素節(jié)點(diǎn),向第二本書增加一個(gè)子元素“評價(jià)”Element element= document.createElement("評價(jià)");element.setTextContent("五星");bookname1.appendChild(element); // =============================================================================== // 五、刪除元素結(jié)點(diǎn),刪除剛剛增加的元素Node comment=document.getElementsByTagName("評價(jià)").item(0);bookname1.removeChild(comment);//存盤的標(biāo)準(zhǔn)寫法TransformerFactory tsf =TransformerFactory.newInstance();Transformer tsTransformer = tsf.newTransformer();tsTransformer.transform(new DOMSource(document), new StreamResult("src/books.xml"));} catch (ParserConfigurationException e) {e.printStackTrace();} catch (SAXException e) {// TODO Auto-generated catch block e.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch block e.printStackTrace();} catch (TransformerConfigurationException e) {// TODO Auto-generated catch block e.printStackTrace();} catch (TransformerException e) {// TODO Auto-generated catch block e.printStackTrace();}} }?
javax.xml.parsers 包中的DocumentBuilderFactory用于創(chuàng)建DOM模式的解析器對象 , DocumentBuilderFactory是一個(gè)抽象工廠類,它不能直接實(shí)例化,但該類提供了一個(gè)newInstance方法 ,這個(gè)方法會(huì)自動(dòng)創(chuàng)建一個(gè)工廠的對象并返回 調(diào)用 DocumentBuilderFactory.newInstance() 方法得到創(chuàng)建 DOM 解析器的工廠。 調(diào)用工廠對象的 newDocumentBuilder方法得到 DOM 解析器對象。 調(diào)用 DOM 解析器對象的 parse() 方法解析 XML 文檔,得到代表整個(gè)文檔的 Document 對象,進(jìn)行可以利用DOM特性對整個(gè)XML文檔進(jìn)行操作了。第二個(gè)例子 xml文檔名為exam.xml <?xml version="1.0" encoding="UTF-8" standalone="no"?> <exam><student idcard="111" examid="222"><name>張三</name><location>沈陽</location><grade>89</grade></student><student idcard="333" examid="444"><name>李四</name><location>大連</location><grade>97</grade></student> </exam> 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.w3c.dom.Attr; 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 ExamXML {public static void main(String[] args) {//1. 向該xml文檔里添加一個(gè)用戶,姓名:王五,;location:鐵嶺;grade:99DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();try {DocumentBuilder documentBuilder=documentBuilderFactory.newDocumentBuilder();//拿到dom樹Document document=documentBuilder.parse("exam.xml");//拿到父節(jié)點(diǎn)Node superNode = document.getElementsByTagName("exam").item(0);Element studentElement=document.createElement("student");Element nameElement=document.createElement("name");Element locationElement=document.createElement("location");Element gradeElement=document.createElement("grade");nameElement.setTextContent("王五");locationElement.setTextContent("鐵嶺");gradeElement.setTextContent("99");studentElement.appendChild(nameElement);studentElement.appendChild(locationElement);studentElement.appendChild(gradeElement);superNode.appendChild(studentElement);NodeList WangwuInfo=document.getElementsByTagName("student").item(2).getChildNodes();for (int i = 0; i < WangwuInfo.getLength(); i++) {if (WangwuInfo.item(i).getNodeType()==1) {System.out.println("第"+i+"個(gè)標(biāo)簽內(nèi)的文本是:"+WangwuInfo.item(i).getTextContent());} }//=========================================================================================//2. 給每個(gè)學(xué)生增加一條信息,性別 NodeList studentList=document.getElementsByTagName("student");for (int i = 0; i < studentList.getLength(); i++) {Element gender=document.createElement("性別");studentList.item(i).appendChild(gender);}System.out.println("給每個(gè)學(xué)生增加性別標(biāo)簽,共有"+document.getElementsByTagName("性別").getLength()+"個(gè)學(xué)生增加");//==================================================================================//3. 刪除第一個(gè)學(xué)生張三的所有信息。Node zhangsan=document.getElementsByTagName("student").item(0);superNode.removeChild(zhangsan);System.out.println("刪除了張三后的學(xué)生標(biāo)簽有:"+studentList.getLength());//======================================================================================//4. 將第二個(gè)學(xué)生李四的姓名改為 李四光Node lisiInfo=document.getElementsByTagName("student").item(0);String lisiName=lisiInfo.getChildNodes().item(1).getTextContent();System.out.println("李四更改名字之前:"+lisiName);lisiInfo.getChildNodes().item(1).setTextContent("李四光");System.out.println("更改名字之后"+lisiInfo.getChildNodes().item(1).getTextContent());//=========================================================================================//5. 給每個(gè)學(xué)生增加一個(gè)ID屬性//增加屬性是元素對象的方法,故從Node強(qiáng)轉(zhuǎn)為element類型for (int i = 0; i < studentList.getLength(); i++) {Attr idAttr=document.createAttribute("id");Element element=(Element) studentList.item(i);element.setAttributeNode(idAttr);} //強(qiáng)轉(zhuǎn)Element element=(Element) studentList.item(0);//設(shè)置屬性element.setAttribute("id", "1234");//打印屬性System.out.println("id:"+element.getAttribute("id"));Element element1=(Element) studentList.item(1);element1.setAttribute("id", "98765");System.out.println("id:"+element1.getAttribute("id"));//存盤操作TransformerFactory tsf =TransformerFactory.newInstance();Transformer tsTransformer = tsf.newTransformer();tsTransformer.transform(new DOMSource(document), new StreamResult("src/Exam.xml"));} catch (ParserConfigurationException e) {e.printStackTrace();} catch (SAXException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} catch (TransformerConfigurationException e) {e.printStackTrace();} catch (TransformerException e) {e.printStackTrace();}} }
?
轉(zhuǎn)載于:https://www.cnblogs.com/linchaohao/p/5141077.html
總結(jié)
- 上一篇: 富文本编辑器 - wangEditor
- 下一篇: 多线程设计模式(四):生产者-消费模式