xml

.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

  1. <!ELEMENT classes (java班,net班,php班,ios班)>  
  2. <!ELEMENT java班 (teachers?,students?)>  
  3. <!ELEMENT net班 (teachers?,students?)>  
  4. <!ELEMENT php班 (teachers?,students?)>  
  5. <!ELEMENT ios班 (teachers?,students?)>  
  6. <!ELEMENT teachers (teacher*)>  
  7. <!ELEMENT teacher EMPTY>  
  8. <!ELEMENT students (student*)>  
  9. <!ELEMENT student (name,sex,age)>  
  10. <!ATTLIST java班 name CDATA #IMPLIED>  
  11. <!ATTLIST net班 name CDATA #IMPLIED>  
  12. <!ATTLIST php班 name CDATA #IMPLIED>  
  13. <!ATTLIST ios班 name CDATA #IMPLIED>  
  14. <!ATTLIST teacher name CDATA #IMPLIED>  
  15. <!ATTLIST teacher sex CDATA #IMPLIED>  
  16. <!ATTLIST teacher age CDATA #IMPLIED>  
  17. <!ELEMENT name (#PCDATA)>  
  18. <!ELEMENT sex (#PCDATA)>  
  19. <!ELEMENT age (#PCDATA)>  
  20. <!ATTLIST student id ID #IMPLIED>  
<!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

  1. <?xml version="1.0" encoding="UTF-8" ?>  
  2. <!DOCTYPE classes SYSTEM "bin//parsers//java.dtd">  
  3. <classes>  
  4.     <java班 name="CSDNJava01班">  
  5.         <teachers>  
  6.             <teacher name="軍哥" sex="男" age="28" />  
  7.             <teacher name="劉麗華" sex="女" age="28" />  
  8.         </teachers>  
  9.         <students>  
  10.             <student id="x121">  
  11.                 <name>王亮</name>  
  12.                 <sex></sex>  
  13.                 <age>28</age>  
  14.             </student>  
  15.         </students>  
  16.     </java>  
  17.     <!-- 註釋0 -->  
  18.     <net班 name="CSDNNet01班">xxx</net>  
  19.     <php班 name="CSDNPhp01班"></php>  
  20.     <ios班 name="CSDNIos01班"></ios>  
  21. </classes>  
  22. <!-- 對java.xml文件進行CRUD的操作 -->  
  23. <!-- 節點  
  24.         nodeName            nodeValue        nodeType  
  25. element  標籤名               null             1  
  26. Attr     屬性名              屬性值            2  
  27. text     #text               文本的值          3  
  28.  -->  
<?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的根節點對象

  1. @Test  
  2.     public void test() throws ParserConfigurationException, SAXException, IOException{  
  3.         //調用 DocumentBuilderFactory.newInstance() 方法得到創建 DOM 解析器的工廠   
  4.         DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();  
  5.         //調用工廠對象的 newDocumentBuilder方法得到 DOM 解析器對象   
  6.         DocumentBuilder builder =  builderFactory.newDocumentBuilder();  
  7.         //通過文件的方式獲取Document對象   
  8.         /*File file = new File("src//parsers//java.xml"); 
  9.         System.out.println(file+"----"); 
  10.         Document document = builder.parse(file);*/  
  11.         //解析指定的文件   
  12.         InputStream is= this.getClass().getClassLoader()  
  13.                               .getResourceAsStream("parsers//java.xml");  
  14.         Document document = builder.parse(is);  
  15.           
  16.         //document.getDocumentElement()獲取根節點的元素對象   
  17.         Element root = document.getDocumentElement();  
  18.         //遍歷根節點下面的所有子節點   
  19.         listNodes(root);  
  20.     }  
@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.遍歷節點對象的方法

  1. /** 
  2.      * 遍歷根據節點對象下面的所有的節點對象 
  3.      * @param node 
  4.      */  
  5.     public void listNodes(Node node) {  
  6.         // 節點是什麼類型的節點   
  7.         if (node.getNodeType() == Node.ELEMENT_NODE) {// 判斷是否是元素節點   
  8.             Element element = (Element) node;  
  9.             //判斷此元素節點是否有屬性   
  10.             if(element.hasAttributes()){  
  11.                 //獲取屬性節點的集合   
  12.                 NamedNodeMap namenm =   element.getAttributes();//Node   
  13.                 //遍歷屬性節點的集合   
  14.                 for(int k=0;k<namenm.getLength();k++){  
  15.                     //獲取具體的某個屬性節點   
  16.                     Attr attr = (Attr) namenm.item(k);  
  17.                     System.out.println("name:::"+attr.getNodeName()+" value::"  
  18.                                      +attr.getNodeValue()+"  type::"+attr.getNodeType());  
  19.                 }  
  20.             }  
  21.             //獲取元素節點的所有孩子節點   
  22.             NodeList listnode = element.getChildNodes();  
  23.             //遍歷   
  24.             for (int j = 0; j < listnode.getLength(); j++) {  
  25.                 //得到某個具體的節點對象   
  26.                 Node nd = listnode.item(j);  
  27.                 System.out.println("name::" + nd.getNodeName() + "  value:::"  
  28.                         + nd.getNodeValue() + "  type:::" + nd.getNodeType());  
  29.                 //重新調用遍歷節點的操作的方法   
  30.                 listNodes(nd);  
  31.             }  
  32.   
  33.         }  
  34.     }  
/**
	 * 遍歷根據節點對象下面的所有的節點對象
	 * @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.查詢某個節點對象(簡單列舉一些案例)

  1. /** 
  2.  * 根據標籤的名稱查找所有該名稱的節點對象 
  3.  */  
  4. public void findNode(Document document) {  
  5.     //根據標籤名稱獲取該名稱的所有節點對象   
  6.     NodeList nodelist = document.getElementsByTagName("teacher");  
  7.     //遍歷   
  8.     for (int i = 0; i < nodelist.getLength(); i++) {  
  9.         //得到具體的某個節點對象   
  10.         Node node = nodelist.item(i);  
  11.         System.out.println(node.getNodeName());  
  12.     }  
  13. }  
  14.   
  15. /** 
  16.  * 根據屬性的值 查詢某個節點對象 
  17.  * 屬性值是唯一(假設) 
  18.  * @param document 
  19.  * @param value 
  20.  * @return 
  21.  */  
  22. public Node findNodeByAttrValue(Document document, String value) {  
  23.     //根據標籤名稱獲取該名稱的節點對象集合   
  24.     NodeList nodelist = document.getElementsByTagName("teacher");  
  25.     //遍歷   
  26.     for (int i = 0; i < nodelist.getLength(); i++) {  
  27.         //獲取某個具體的元素節點對象   
  28.         Element node = (Element) nodelist.item(i);  
  29.         //根據屬性名稱獲取該節點的屬性節點對象   
  30.         Attr attr = node.getAttributeNode("name");  
  31.         //獲取屬性節點的值是否給指定的節點屬性值相同   
  32.         if (attr.getNodeValue().equals(value)) {  
  33.             //返回此節點   
  34.             return node;  
  35.         }  
  36.     }  
  37.     return null;  
  38. }  
  39.   
  40. /** 
  41.  * 根據id獲取某個節點對象 
  42.  *  
  43.  * @param document 
  44.  * @param id 
  45.  * @return 
  46.  */  
  47. public Node findNodeById(Document document, String id) {  
  48.     return document.getElementById(id);  
  49. }  
	/**
	 * 根據標籤的名稱查找所有該名稱的節點對象
	 */
	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.刪除指定的節點對象

  1. /** 
  2.      * 刪除某個節點對象 
  3.      *  
  4.      * @param document 
  5.      * @param id 
  6.      * @throws TransformerException 
  7.      */  
  8.     public void deleteNodeById(Document document, String id)  
  9.             throws TransformerException {  
  10.         //獲取刪除的節點對象   
  11.         Node node = document.getElementById(id);  
  12.         // 是通過父節點調用removeChild(node)把子節點給刪除掉   
  13.         Node node1 = node.getParentNode().removeChild(node);  
  14.           
  15.         //創建TransformerFactory對象   
  16.         TransformerFactory transformerFactory = TransformerFactory  
  17.                 .newInstance();  
  18.         //Transformer類用於把代表XML文件的Document對象轉換爲某種格式後進行輸出   
  19.         //Transformer對象通過TransformerFactory獲得   
  20.         Transformer transformer = transformerFactory.newTransformer();  
  21.         // 把Document對象又重新寫入到一個XML文件中。   
  22.         transformer.transform(new DOMSource(document), new StreamResult(  
  23.                 new File("src//a.xml")));  
  24.     }  
/**
	 * 刪除某個節點對象
	 * 
	 * @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.更新某個節點對象

  1. /** 
  2.  * 更新某個節點 
  3.  *  
  4.  * @param document 
  5.  * @param id 
  6.  * @throws TransformerException 
  7.  */  
  8. public void updateNodeById(Document document, String id)  
  9.         throws TransformerException {  
  10.     //根據id獲取元素指定的元素節點對象   
  11.     Element node = document.getElementById(id);  
  12.     //獲取元素節點的id屬性節點對象   
  13.     Attr attr = node.getAttributeNode("id");  
  14.     //修改元素節點的屬性值   
  15.     attr.setValue("x122");  
  16.   
  17.     //獲取該節點對象的所有孩子節點對象name、age、sex節點   
  18.     NodeList nodelist = node.getChildNodes();  
  19.        //遍歷   
  20.     for (int i = 0; i < nodelist.getLength(); i++) {  
  21.         //得到具體的節點對象   
  22.         Node n = nodelist.item(i);  
  23.         //判斷是否是元素節點對象   
  24.         if (n.getNodeType() == Node.ELEMENT_NODE) {  
  25.             //看是否是name節點   
  26.             if (n.getNodeName().equals("name")) {  
  27.                 n.setTextContent("君君");//修改其值   
  28.             } else if (n.getNodeName().equals("age")) {//看看是否是age節點   
  29.                 n.setTextContent("80");//修改其值   
  30.             } else if (n.getNodeName().equals("sex")) {//看看是否是sex節點   
  31.                 n.setTextContent("男");//修改其值   
  32.             } else {  
  33.                 System.out.println("不做處理");  
  34.             }  
  35.         }  
  36.     }  
  37.   
  38.     //創建TransformerFactory對象   
  39.     TransformerFactory transformerFactory = TransformerFactory  
  40.             .newInstance();  
  41.     //Transformer類用於把代表XML文件的Document對象轉換爲某種格式後進行輸出   
  42.     //Transformer對象通過TransformerFactory獲得   
  43.     Transformer transformer = transformerFactory.newTransformer();  
  44.     //把Document對象又重新寫入到一個XML文件中。   
  45.     transformer.transform(new DOMSource(document), new StreamResult(  
  46.             new File("src//b.xml")));  
  47. }  
	/**
	 * 更新某個節點
	 * 
	 * @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.在某個節點的下方添加新的節點

  1. /** 
  2.  * 在指定的節點下方添加新得某個節點 
  3.  *  
  4.  * @param document 
  5.  * @param id 
  6.  * @throws TransformerException 
  7.  */  
  8. public void addNodeById(Document document, String id)  
  9.         throws TransformerException {  
  10.     //獲取要添加位置節點的兄弟節點對象   
  11.     Element node = document.getElementById(id);  
  12.     //獲取其父節點對象   
  13.     Node parentNode = node.getParentNode();  
  14.     //創建元素節點   
  15.     Element nd = document.createElement("student");  
  16.     //設置元素節點的屬性值   
  17.     nd.setAttribute("id""x123");  
  18.     //創建name元素節點   
  19.     Node name = document.createElement("name");  
  20.     //設置name節點的文本值   
  21.     name.appendChild(document.createTextNode("陳紅軍"));  
  22.     //創建age元素節點   
  23.     Node age = document.createElement("age");  
  24.     //設置age節點的文本值   
  25.     age.appendChild(document.createTextNode("20"));  
  26.     //創建sex元素節點   
  27.     Node sex = document.createElement("sex");  
  28.     //設置sex節點的文本值   
  29.     sex.appendChild(document.createTextNode("男"));  
  30.     //在nd節點中添加3個子節點   
  31.     nd.appendChild(name);  
  32.     nd.appendChild(age);  
  33.     nd.appendChild(sex);  
  34.     //在父節點中添加nd節點   
  35.     parentNode.appendChild(nd);  
  36.   
  37.     //創建TransformerFactory對象   
  38.     TransformerFactory transformerFactory = TransformerFactory  
  39.             .newInstance();  
  40.     //Transformer類用於把代表XML文件的Document對象轉換爲某種格式後進行輸出   
  41.     //Transformer對象通過TransformerFactory獲得   
  42.     Transformer transformer = transformerFactory.newTransformer();  
  43.     //把Document對象又重新寫入到一個XML文件中。   
  44.     transformer.transform(new DOMSource(document), new StreamResult(  
  45.             new File("src//c.xml")));  
  46. }  
	/**
	 * 在指定的節點下方添加新得某個節點
	 * 
	 * @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")));
	}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章