參考:https://blog.csdn.net/p812438109/article/details/81807440
1、Document介紹。
答:API來源:在JDK中javax.xml.*包下。
2、Document使用場景:
1)、需要知道XML文檔所有結構。
2)、需要把文檔一些元素排序。
3)、文檔中的信息被多次使用的情況。
3、Document的優勢和缺點:
1)、優勢:由於Document是java中自帶的解析器,兼容性強。
2)、缺點:由於Document是一次性加載文檔信息,如果文檔太大,加載耗時長,不太適用。
4、Document生成XML,步驟如下所示:
1 package com.demo.utils; 2 3 import java.io.File; 4 5 import javax.xml.parsers.DocumentBuilder; 6 import javax.xml.parsers.DocumentBuilderFactory; 7 import javax.xml.parsers.ParserConfigurationException; 8 import javax.xml.transform.OutputKeys; 9 import javax.xml.transform.Transformer; 10 import javax.xml.transform.TransformerConfigurationException; 11 import javax.xml.transform.TransformerException; 12 import javax.xml.transform.TransformerFactory; 13 import javax.xml.transform.dom.DOMSource; 14 import javax.xml.transform.stream.StreamResult; 15 16 import org.w3c.dom.Document; 17 import org.w3c.dom.Element; 18 19 /** 20 * Document生成XML 21 * 22 * @author 23 * 24 */ 25 public class CreateDocument { 26 27 public static void main(String[] args) { 28 // 執行Document生成XML方法 29 createDocument(new File("E:\\person.xml")); 30 } 31 32 public static void createDocument(File file) { 33 try { 34 // 第一步:初始化一個XML解析工廠。 35 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 36 37 // 第二步:創建一個DocumentBuilder實例。 38 DocumentBuilder builder = factory.newDocumentBuilder(); 39 40 // 第三步:構建一個Document實例。 41 Document doc = builder.newDocument(); 42 // standalone用來表示該文件是否呼叫其它外部的文件。若值是 "yes"表示沒有呼叫外部文件 43 doc.setXmlStandalone(true); 44 45 // 第四步:創建一個根節點,名稱為root,並設置一些基本屬性。 46 // 創建一個根節點 47 // 說明: doc.createElement("元素名")、 48 // element.setAttribute("屬性名","屬性值")、設置節點屬性 49 // element.setTextContent("標簽間的內容"),設置標簽之間的內容 50 Element element = doc.createElement("root"); 51 element.setAttribute("attr", "root"); 52 53 // 創建根節點第一個子節點 54 Element elementChildOne = doc.createElement("userInfo"); 55 elementChildOne.setAttribute("attr", "userInfo1"); 56 element.appendChild(elementChildOne); 57 58 // 第一個子節點的第一個子節點 59 Element childOneOne = doc.createElement("zhangsansan"); 60 childOneOne.setAttribute("attr", "userInfo1"); 61 childOneOne.setTextContent("attr zhangsansan"); 62 elementChildOne.appendChild(childOneOne); 63 64 // 第一個子節點的第二個子節點 65 Element childOneTwo = doc.createElement("lisisi"); 66 childOneTwo.setAttribute("attr", "userInfo1"); 67 childOneTwo.setTextContent("attr lisisi"); 68 elementChildOne.appendChild(childOneTwo); 69 70 // 創建根節點第二個子節點 71 Element elementChildTwo = doc.createElement("userInfo"); 72 elementChildTwo.setAttribute("attr", "userInfo2"); 73 element.appendChild(elementChildTwo); 74 75 // 第二個子節點的第一個子節點 76 Element childTwoOne = doc.createElement("lisisi"); 77 childTwoOne.setAttribute("attr", "userInfo2"); 78 childTwoOne.setTextContent("attr lisisi"); 79 elementChildTwo.appendChild(childTwoOne); 80 81 // 第二個子節點的第二個子節點 82 Element childTwoTwo = doc.createElement("wangwuwu"); 83 childTwoTwo.setAttribute("attr", "userInfo2"); 84 childTwoTwo.setTextContent("attr wangwuwu"); 85 elementChildTwo.appendChild(childTwoTwo); 86 87 // 第五步:把節點添加到Document中,再創建一些子節點加入,添加根節點 88 doc.appendChild(element); 89 90 // 第六步:把構造的XML結構,寫入到具體的文件中 91 // 把構造的XML結構,寫入到具體的文件中 92 TransformerFactory formerFactory = TransformerFactory.newInstance(); 93 Transformer transformer = formerFactory.newTransformer(); 94 // 換行 95 transformer.setOutputProperty(OutputKeys.INDENT, "YES"); 96 // 文檔字符編碼 97 transformer.setOutputProperty(OutputKeys.ENCODING, "utf-8"); 98 99 // 可隨意指定文件的后綴,效果一樣,但xml比較好解析,比如: E:\\person.txt等 100 transformer.transform(new DOMSource(doc), new StreamResult(file)); 101 102 System.out.println("XML CreateDocument success!"); 103 } catch (ParserConfigurationException e) { 104 e.printStackTrace(); 105 } catch (TransformerConfigurationException e) { 106 e.printStackTrace(); 107 } catch (TransformerException e) { 108 e.printStackTrace(); 109 } 110 } 111 112 }
演示效果,如果是實際業務,可能要結合具體的業務進行分析,隨時這東西,不常用吧,但是遇到了還是得會處理這種業務和需求的,如下所示:
5、Document解析XML,步驟如下所示:
1 package com.demo.utils; 2 3 import java.io.File; 4 import java.io.IOException; 5 6 import javax.xml.parsers.DocumentBuilder; 7 import javax.xml.parsers.DocumentBuilderFactory; 8 import javax.xml.parsers.ParserConfigurationException; 9 10 import org.w3c.dom.Attr; 11 import org.w3c.dom.Document; 12 import org.w3c.dom.Element; 13 import org.w3c.dom.NamedNodeMap; 14 import org.w3c.dom.Node; 15 import org.w3c.dom.NodeList; 16 import org.xml.sax.SAXException; 17 18 /** 19 * 20 * @author Document解析XML 21 * 22 */ 23 public class ParseDocument { 24 25 public static void main(String[] args) { 26 File file = new File("E:\\person.xml"); 27 if (!file.exists()) { 28 System.out.println("xml文件不存在,請確認!"); 29 } else { 30 // 第一步:先獲取需要解析的文件,判斷文件是否已經存在或有效 31 parseDocument(file); 32 } 33 } 34 35 public static void parseDocument(File file) { 36 try { 37 // 第二步:初始化一個XML解析工廠 38 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 39 40 // 第三步:創建一個DocumentBuilder實例 41 DocumentBuilder builder = factory.newDocumentBuilder(); 42 43 // 第四步:創建一個解析XML的Document實例 44 Document doc = builder.parse(file); 45 46 // 第五步:先獲取根節點的信息,然后根據根節點遞歸一層層解析XML 47 // 獲取根節點名稱 48 String rootName = doc.getDocumentElement().getTagName(); 49 System.out.println("根節點: " + rootName); 50 51 System.out.println("遞歸解析--------------begin------------------"); 52 // 遞歸解析Element 53 Element element = doc.getDocumentElement(); 54 parseElement(element); 55 System.out.println("遞歸解析--------------end------------------"); 56 } catch (ParserConfigurationException e) { 57 e.printStackTrace(); 58 } catch (SAXException e) { 59 e.printStackTrace(); 60 } catch (IOException e) { 61 e.printStackTrace(); 62 } 63 } 64 65 // 遞歸方法 66 public static void parseElement(Element element) { 67 System.out.print("<" + element.getTagName()); 68 NamedNodeMap attris = element.getAttributes(); 69 for (int i = 0; i < attris.getLength(); i++) { 70 Attr attr = (Attr) attris.item(i); 71 System.out.print(" " + attr.getName() + "=\"" + attr.getValue() + "\""); 72 } 73 System.out.println(">"); 74 75 NodeList nodeList = element.getChildNodes(); 76 Node childNode; 77 for (int temp = 0; temp < nodeList.getLength(); temp++) { 78 childNode = nodeList.item(temp); 79 80 // 判斷是否屬於節點 81 if (childNode.getNodeType() == Node.ELEMENT_NODE) { 82 // 判斷是否還有子節點 83 if (childNode.hasChildNodes()) { 84 parseElement((Element) childNode); 85 } else if (childNode.getNodeType() != Node.COMMENT_NODE) { 86 System.out.print(childNode.getTextContent()); 87 } 88 } 89 } 90 System.out.println("</" + element.getTagName() + ">"); 91 } 92 93 }
解析效果,如下所示:
1 根節點: root 2 遞歸解析--------------begin------------------ 3 <root attr="root"> 4 <userInfo attr="userInfo1"> 5 <zhangsansan attr="userInfo1"> 6 </zhangsansan> 7 <lisisi attr="userInfo1"> 8 </lisisi> 9 </userInfo> 10 <userInfo attr="userInfo2"> 11 <lisisi attr="userInfo2"> 12 </lisisi> 13 <wangwuwu attr="userInfo2"> 14 </wangwuwu> 15 </userInfo> 16 </root> 17 遞歸解析--------------end------------------