您好,登錄后才能下訂單哦!
1.javax.xml.parsers 包中的DocumentBuilderFactory用于創(chuàng)建DOM模式的解析器對(duì)象 , DocumentBuilderFactory是一個(gè)抽象工廠類,它不能直接實(shí)例化,但該類提供了一個(gè)newInstance方法 ,這個(gè)方法會(huì)根據(jù)本地平臺(tái)默認(rèn)安裝的解析器,自動(dòng)創(chuàng)建一個(gè)工廠的對(duì)象并返回
2.調(diào)用 DocumentBuilderFactory.newInstance() 方法得到創(chuàng)建 DOM 解析器的工廠。
3.調(diào)用工廠對(duì)象的 newDocumentBuilder方法得到 DOM 解析器對(duì)象。
4.調(diào)用 DOM 解析器對(duì)象的 parse() 方法解析 XML 文檔,得到代表整個(gè)文檔的 Document 對(duì)象,進(jìn)行可以利用DOM特性對(duì)整個(gè)XML文檔進(jìn)行操作了。
案例1.遍歷xml文件中跟節(jié)點(diǎn)下面的所有子節(jié)點(diǎn).
1.xml的約束文件Java.dtd
<!ELEMENT classes (java班,net班,php班,ios班)> <!ELEMENT java班 (teachers?,students?)> <!ELEMENT net班 (teachers?,students?)> <!ELEMENT php班 (teachers?,students?)> <!ELEMENT ios班 (teachers?,students?)> <!ELEMENT teachers (teacher*)> <!ELEMENT teacher EMPTY> <!ELEMENT students (student*)> <!ELEMENT student (name,sex,age)> <!ATTLIST java班 name CDATA #IMPLIED> <!ATTLIST net班 name CDATA #IMPLIED> <!ATTLIST php班 name CDATA #IMPLIED> <!ATTLIST ios班 name CDATA #IMPLIED> <!ATTLIST teacher name CDATA #IMPLIED> <!ATTLIST teacher sex CDATA #IMPLIED> <!ATTLIST teacher age CDATA #IMPLIED> <!ELEMENT name (#PCDATA)> <!ELEMENT sex (#PCDATA)> <!ELEMENT age (#PCDATA)> <!ATTLIST student id ID #IMPLIED>
2.xml文件內(nèi)容如下java.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE classes SYSTEM "bin//parsers//java.dtd"> <classes> <java班 name="CSDNJava01班"> <teachers> <teacher name="軍哥" sex="男" age="28" /> <teacher name="劉麗華" sex="女" age="28" /> </teachers> <students> <student id="x121"> <name>王亮</name> <sex>女</sex> <age>28</age> </student> </students> </java班> <!-- 注釋0 --> <net班 name="CSDNNet01班">xxx</net班> <php班 name="CSDNPhp01班"></php班> <ios班 name="CSDNIos01班"></ios班> </classes> <!-- 對(duì)java.xml文件進(jìn)行CRUD的操作 --> <!-- 節(jié)點(diǎn) nodeName nodeValue nodeType element 標(biāo)簽名 null 1 Attr 屬性名 屬性值 2 text #text 文本的值 3 -->
3.遍歷xml文件的操作
//1.獲取XML的根節(jié)點(diǎn)對(duì)象 @Test public void test() throws ParserConfigurationException, SAXException, IOException{ //調(diào)用 DocumentBuilderFactory.newInstance() 方法得到創(chuàng)建 DOM 解析器的工廠 DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance(); //調(diào)用工廠對(duì)象的 newDocumentBuilder方法得到 DOM 解析器對(duì)象 DocumentBuilder builder = builderFactory.newDocumentBuilder(); //通過(guò)文件的方式獲取Document對(duì)象 /*File file = new File("src//parsers//java.xml"); System.out.println(file+"----"); Document document = builder.parse(file);*/ //解析指定的文件 InputStream is= this.getClass().getClassLoader() .getResourceAsStream("parsers//java.xml"); Document document = builder.parse(is); //document.getDocumentElement()獲取根節(jié)點(diǎn)的元素對(duì)象 Element root = document.getDocumentElement(); //遍歷根節(jié)點(diǎn)下面的所有子節(jié)點(diǎn) listNodes(root); }
2.遍歷節(jié)點(diǎn)對(duì)象的方法
/** * 遍歷根據(jù)節(jié)點(diǎn)對(duì)象下面的所有的節(jié)點(diǎn)對(duì)象 * @param node */ public void listNodes(Node node) { // 節(jié)點(diǎn)是什么類型的節(jié)點(diǎn) if (node.getNodeType() == Node.ELEMENT_NODE) {// 判斷是否是元素節(jié)點(diǎn) Element element = (Element) node; //判斷此元素節(jié)點(diǎn)是否有屬性 if(element.hasAttributes()){ //獲取屬性節(jié)點(diǎn)的集合 NamedNodeMap namenm = element.getAttributes();//Node //遍歷屬性節(jié)點(diǎn)的集合 for(int k=0;k<namenm.getLength();k++){ //獲取具體的某個(gè)屬性節(jié)點(diǎn) Attr attr = (Attr) namenm.item(k); System.out.println("name:::"+attr.getNodeName()+" value::" +attr.getNodeValue()+" type::"+attr.getNodeType()); } } //獲取元素節(jié)點(diǎn)的所有孩子節(jié)點(diǎn) NodeList listnode = element.getChildNodes(); //遍歷 for (int j = 0; j < listnode.getLength(); j++) { //得到某個(gè)具體的節(jié)點(diǎn)對(duì)象 Node nd = listnode.item(j); System.out.println("name::" + nd.getNodeName() + " value:::" + nd.getNodeValue() + " type:::" + nd.getNodeType()); //重新調(diào)用遍歷節(jié)點(diǎn)的操作的方法 listNodes(nd); } } }
4.查詢某個(gè)節(jié)點(diǎn)對(duì)象(簡(jiǎn)單列舉一些案例)
/** * 根據(jù)標(biāo)簽的名稱查找所有該名稱的節(jié)點(diǎn)對(duì)象 */ public void findNode(Document document) { //根據(jù)標(biāo)簽名稱獲取該名稱的所有節(jié)點(diǎn)對(duì)象 NodeList nodelist = document.getElementsByTagName("teacher"); //遍歷 for (int i = 0; i < nodelist.getLength(); i++) { //得到具體的某個(gè)節(jié)點(diǎn)對(duì)象 Node node = nodelist.item(i); System.out.println(node.getNodeName()); } } /** * 根據(jù)屬性的值 查詢某個(gè)節(jié)點(diǎn)對(duì)象 * 屬性值是唯一(假設(shè)) * @param document * @param value * @return */ public Node findNodeByAttrValue(Document document, String value) { //根據(jù)標(biāo)簽名稱獲取該名稱的節(jié)點(diǎn)對(duì)象集合 NodeList nodelist = document.getElementsByTagName("teacher"); //遍歷 for (int i = 0; i < nodelist.getLength(); i++) { //獲取某個(gè)具體的元素節(jié)點(diǎn)對(duì)象 Element node = (Element) nodelist.item(i); //根據(jù)屬性名稱獲取該節(jié)點(diǎn)的屬性節(jié)點(diǎn)對(duì)象 Attr attr = node.getAttributeNode("name"); //獲取屬性節(jié)點(diǎn)的值是否給指定的節(jié)點(diǎn)屬性值相同 if (attr.getNodeValue().equals(value)) { //返回此節(jié)點(diǎn) return node; } } return null; } /** * 根據(jù)id獲取某個(gè)節(jié)點(diǎn)對(duì)象 * * @param document * @param id * @return */ public Node findNodeById(Document document, String id) { return document.getElementById(id); }
5.刪除指定的節(jié)點(diǎn)對(duì)象
/** * 刪除某個(gè)節(jié)點(diǎn)對(duì)象 * * @param document * @param id * @throws TransformerException */ public void deleteNodeById(Document document, String id) throws TransformerException { //獲取刪除的節(jié)點(diǎn)對(duì)象 Node node = document.getElementById(id); // 是通過(guò)父節(jié)點(diǎn)調(diào)用removeChild(node)把子節(jié)點(diǎn)給刪除掉 Node node1 = node.getParentNode().removeChild(node); //創(chuàng)建TransformerFactory對(duì)象 TransformerFactory transformerFactory = TransformerFactory .newInstance(); //Transformer類用于把代表XML文件的Document對(duì)象轉(zhuǎn)換為某種格式后進(jìn)行輸出 //Transformer對(duì)象通過(guò)TransformerFactory獲得 Transformer transformer = transformerFactory.newTransformer(); // 把Document對(duì)象又重新寫(xiě)入到一個(gè)XML文件中。 transformer.transform(new DOMSource(document), new StreamResult( new File("src//a.xml"))); }
6.更新某個(gè)節(jié)點(diǎn)對(duì)象
/** * 更新某個(gè)節(jié)點(diǎn) * * @param document * @param id * @throws TransformerException */ public void updateNodeById(Document document, String id) throws TransformerException { //根據(jù)id獲取元素指定的元素節(jié)點(diǎn)對(duì)象 Element node = document.getElementById(id); //獲取元素節(jié)點(diǎn)的id屬性節(jié)點(diǎn)對(duì)象 Attr attr = node.getAttributeNode("id"); //修改元素節(jié)點(diǎn)的屬性值 attr.setValue("x122"); //獲取該節(jié)點(diǎn)對(duì)象的所有孩子節(jié)點(diǎn)對(duì)象name、age、sex節(jié)點(diǎn) NodeList nodelist = node.getChildNodes(); //遍歷 for (int i = 0; i < nodelist.getLength(); i++) { //得到具體的節(jié)點(diǎn)對(duì)象 Node n = nodelist.item(i); //判斷是否是元素節(jié)點(diǎn)對(duì)象 if (n.getNodeType() == Node.ELEMENT_NODE) { //看是否是name節(jié)點(diǎn) if (n.getNodeName().equals("name")) { n.setTextContent("君君");//修改其值 } else if (n.getNodeName().equals("age")) {//看看是否是age節(jié)點(diǎn) n.setTextContent("80");//修改其值 } else if (n.getNodeName().equals("sex")) {//看看是否是sex節(jié)點(diǎn) n.setTextContent("男");//修改其值 } else { System.out.println("不做處理"); } } } //創(chuàng)建TransformerFactory對(duì)象 TransformerFactory transformerFactory = TransformerFactory .newInstance(); //Transformer類用于把代表XML文件的Document對(duì)象轉(zhuǎn)換為某種格式后進(jìn)行輸出 //Transformer對(duì)象通過(guò)TransformerFactory獲得 Transformer transformer = transformerFactory.newTransformer(); //把Document對(duì)象又重新寫(xiě)入到一個(gè)XML文件中。 transformer.transform(new DOMSource(document), new StreamResult( new File("src//b.xml"))); }
7.在某個(gè)節(jié)點(diǎn)的下方添加新的節(jié)點(diǎn)
/** * 在指定的節(jié)點(diǎn)下方添加新得某個(gè)節(jié)點(diǎn) * * @param document * @param id * @throws TransformerException */ public void addNodeById(Document document, String id) throws TransformerException { //獲取要添加位置節(jié)點(diǎn)的兄弟節(jié)點(diǎn)對(duì)象 Element node = document.getElementById(id); //獲取其父節(jié)點(diǎn)對(duì)象 Node parentNode = node.getParentNode(); //創(chuàng)建元素節(jié)點(diǎn) Element nd = document.createElement("student"); //設(shè)置元素節(jié)點(diǎn)的屬性值 nd.setAttribute("id", "x123"); //創(chuàng)建name元素節(jié)點(diǎn) Node name = document.createElement("name"); //設(shè)置name節(jié)點(diǎn)的文本值 name.appendChild(document.createTextNode("陳紅軍")); //創(chuàng)建age元素節(jié)點(diǎn) Node age = document.createElement("age"); //設(shè)置age節(jié)點(diǎn)的文本值 age.appendChild(document.createTextNode("20")); //創(chuàng)建sex元素節(jié)點(diǎn) Node sex = document.createElement("sex"); //設(shè)置sex節(jié)點(diǎn)的文本值 sex.appendChild(document.createTextNode("男")); //在nd節(jié)點(diǎn)中添加3個(gè)子節(jié)點(diǎn) nd.appendChild(name); nd.appendChild(age); nd.appendChild(sex); //在父節(jié)點(diǎn)中添加nd節(jié)點(diǎn) parentNode.appendChild(nd); //創(chuàng)建TransformerFactory對(duì)象 TransformerFactory transformerFactory = TransformerFactory .newInstance(); //Transformer類用于把代表XML文件的Document對(duì)象轉(zhuǎn)換為某種格式后進(jìn)行輸出 //Transformer對(duì)象通過(guò)TransformerFactory獲得 Transformer transformer = transformerFactory.newTransformer(); //把Document對(duì)象又重新寫(xiě)入到一個(gè)XML文件中。 transformer.transform(new DOMSource(document), new StreamResult( new File("src//c.xml"))); }
通過(guò)以上方法的練習(xí)希望你對(duì)xml的DOM解析有個(gè)入門(mén)的了解.
總結(jié)
以上所述是小編給大家介紹的使用jaxp進(jìn)行dom解析_,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)億速云網(wǎng)站的支持!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。