使用JAXP進行DOM解析( DocumentBuilderFactory、DocumentBuilder、Document)
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
- -->
//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解析有個入門的瞭解.
轉載: http://blog.csdn.net/redarmy_chen/article/details/12912065
相關文章
- 使用JAXP對xml文件進行DOM解析基礎XML
- 使用jaxp解析器dom方式對xml節點進行操作XML
- 使用DocumentBuilderFactory解析XML淺談UIXML
- jaxp的sax解析操作
- XML DOM(Document Object Model)XMLObject
- JavaScript 之 DOM [ Document物件 ]JavaScript物件
- document、DOM、window、BOM區別
- DOM (文件物件模型(Document Object Model))物件模型Object
- HTML DOM 知識點整理(一)—— Document物件HTML物件
- HTML DOM之document物件的屬性和方法HTML物件
- 使用DOM解析來實現PHP模版引擎PHP
- 使用cJSON庫對JSON格式進行解析JSON
- DOM 常用 API 解析API
- Python XML解析之DOMPythonXML
- XML 檔案解析實踐 (DOM 解析)XML
- dom解析和sax解析的區別
- XML DOM 解析器概述XML
- React-原始碼解析-DOM模型React原始碼模型
- XML DOM 解析器錯誤概述XML
- document,document.documentElement區別
- 基於 DOM 的 XML 檔案解析類XML
- css載入會阻塞DOM樹解析嗎?CSS
- 使用Redis進行限流Redis
- 什麼是域名解析?如何進行域名解析設定?
- document load 和 document ready 的區別
- document load 和document ready的區別?
- 透過Requests模組獲取網頁內容並使用BeautifulSoup進行解析網頁
- 使用go語言對csv檔案進行解析處理,匯入匯出。Go
- java的XML解析(DOM4J技術)JavaXML
- Vue3 DOM Diff 核心演算法解析Vue演算法
- Elasticsearch DocumentElasticsearch
- QML Document
- Document物件物件
- 使用Devstack進行開發dev
- 使用 Devstack 進行開發dev
- 使用 useSeoMeta 進行 SEO 配置
- 使用argparse進行調參
- 使用pprof進行效能分析
- 使用 JavaScript 上傳 PDF 和 Excel 等二進位制檔案到 ABAP 伺服器並進行解析JavaScriptExcel伺服器