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