使用jaxp解析器dom方式對xml節點進行操作
作為一名初學者,對一些程式語言感覺不是很簡單。尤其是正在學習的Javaweb這一部分的內容,非常駁雜,讓人頭大。
看過一些書,也包括聽一些人說,寫部落格有利於理解和記憶。作為一名初學者,我抱著學習和積累的心理,開始我的部落格之旅。希望各位前輩和同濟多指教。
jaxp,剛開始學習的時候不理解是什麼意思,特地百度一下,原來是處理xml的Java api。今天主要學習了xml的dom解析方式。對於jaxp,我也不知道準確的稱呼方式,在下文皆稱為解析器。jaxp解析器位於jdk api 的javax.xml.parsers包中。其中DocumentBuilder和DocumentBuilderFactory這兩個類是針對dom方式的。這兩個類都是抽象類,不能通過構造方法例項化,下面是這兩個類獲取例項的方法:
//建立解析器工廠
DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
//通解析器工廠來建立解析器
DocumentBuilder builder = builderFactory.newDocumentBuilder();
下面使用jaxp解析器來解析xml文件,給出一個xml檔案如下(在下文中此xml檔案的位置為src/person.xml):
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<perosn>
<p1>
<name>zhaosi</name>
<age>12</age>
</p1>
<p1>
<name>lisan</name>
<age>22</age>
</p1>
</perosn>
1.使用jaxp實現查詢操作,比如查詢所有name元素的值
java程式碼如下:
public static void selectNames() throws Exception {
//建立解析器工廠
DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
//建立解析器
DocumentBuilder builder = builderFactory.newDocumentBuilder();
//解析xml檔案得到Document物件
Document document = builder.parse("src/person.xml");
//通過標籤(元素)名得到對應的集合
NodeList names = document.getElementsByTagName("name");
//遍歷集合,並列印節點文字內容
for (int x=0; x<names.getLength(); x++) {
Node name = names.item(x);//通過item方法得到集合中第x個項
System.out.println(name.getTextContent());//獲取文字內容並列印
}
}
使用getElementsByTagName()方法可以獲得對應元素的集合。如果想要查詢某一個元素的值,便不需要遍歷,直接使用item()方法即可:
Node name1 = document.getElementsByTagName("name").item(0);
這樣便可以得到對應的節點了。
2.使用jaxp實現新增操作,比如在第一個p1標籤中age標籤的後面新增一個節點<sex>man</sex>
java 程式碼如下:
public static void addSex() throws Exception {
//建立解析器工廠
DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
//建立解析器
DocumentBuilder builder = builderFactory.newDocumentBuilder();
//解析xml文件得到Document物件
Document document = builder.parse("src/person.xml");
//得到第一個p1節點
Node p1 = document.getElementsByTagName("p1").item(0);
//新增sex節點
//首先建立sex標籤及其文字並結合
Node sex = document.createElement("sex");
Text text = document.createTextNode("man");
sex.appendChild(text);
//將此節點新增到p1下
p1.appendChild(sex);
//回寫xml,將源樹轉換為結果樹
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
//轉換
transformer.transform(new DOMSource(document), new StreamResult("src/person.xml"));
}
可以看到在使用jaxp對xml檔案進行操作時,前三步基本上是相同的。而新增節點後之所以需要回寫,是因為新增節點的操作改變的是記憶體中DOM樹(源樹)的結構,而非xml檔案。DOMSource(Source的子類)以DOM樹的形式充當源樹的持有者,StreamResult(Result的子類)充當轉換結果的持有者。
3.使用jaxp實現修改操作,比如將sex標籤的內容改為woman
public static void setSex() throws Exception {
//建立解析器工廠
DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
//根據解析器工廠建立解析器
DocumentBuilder builder = builderFactory.newDocumentBuilder();
//解析xml檔案,得到Document物件
Document document = builder.parse("src/person.xml");
//得到sex節點
Node sex = document.getElementsByTagName("sex").item(0);
//修改節點文字內容
sex.setTextContent("woman");
//回寫
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
transformer.transform(new DOMSource(document), new StreamResult("src/person.xml"));
}
4.使用jaxp實現刪除操作,比如刪除sex節點
public static void removeSex() throws Exception {
//建立解析器工廠
DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
//通過解析器工廠得到解析器
DocumentBuilder builder = builderFactory.newDocumentBuilder();
//解析xml檔案得到Document物件
Document document = builder.parse("src/person.xml");
//得到sex節點
Node sex = document.getElementsByTagName("sex").item(0);
//得到sex節點的父節點
Node sexParent = sex.getParentNode();
//刪除
sexParent.removeChild(sex);
//回寫
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
transformer.transform(new DOMSource(document), new StreamResult("src/person.xml"));
}
5.使用jaxp遍歷所有節點
public static void nodesTraversal() throws Exception {
//建立解析器工廠
DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
//通過解析器工廠得到解析器
DocumentBuilder builder = builderFactory.newDocumentBuilder();
//解析xml檔案得到Document物件
Document document = builder.parse("src/person.xml");
//遍歷
recurMethod(document);
}
//使用遞迴的方式進行節點的遍歷
public static void recurMethod(Node node) {
if(node.getNodeType()==Node.ELEMENT_NODE) {
//先判斷其是否為元素節點,是則列印
System.out.println(node.getNodeName());
}
if(node.hasChildNodes()) {//判斷其是否存在子節點
//如果該節點存在子節點則進行其子節點的遍歷
NodeList nodeList = node.getChildNodes();
for (int x=0; x<nodeList.getLength(); x++) {
Node childNode = nodeList.item(x);
recurMethod(childNode);//遞迴
}
}
}
以上內容,作為對初學jaxp解析器dom方式解析xml的輸出和加強。如果有什麼錯誤或者誤差亦或是缺失,希望得到指正哈!
相關文章
- 使用JAXP對xml文件進行DOM解析基礎XML
- XML DOM 解析器概述XML
- XML DOM 新增節點概述XML
- dom4j 根據xml節點路徑查詢節點,找到對應的目標節點下的子節點,對節點Text值進行修改XML
- XML DOM 替換節點概述XML
- XML DOM 刪除節點概述XML
- XML DOM 解析器錯誤概述XML
- jQuery操作dom節點empty()方法jQuery
- JavaScript學習之DOM(節點、節點層級、節點操作)JavaScript
- JS中的DOM— —節點以及操作JS
- PHP透過DOM操作XMLPHPXML
- layui tree 對節點進行搜尋UI
- jaxp的sax解析操作
- jQuery關於DOM操作節點一些方法jQuery
- 請說說DOM節點的操作如何最佳化?
- Python如何對浮點數進行取整操作?Python
- <react學習筆記(7)>操作DOM節點,元件傳參React筆記元件
- DOM 節點遍歷:掌握遍歷 XML文件結構和內容的技巧XML
- jquery中dom節點操作方法empty和remove的區別jQueryREM
- 使用shell 方式對 vcenter 進行補丁升級
- 軟體測試:DOM節點
- Jaxb - 生成帶名稱空間和節點字首的Xml的方式XML
- 【超好用API推薦】用dom4j建立XML檔案並寫入節點APIXML
- DOM節點刪除方法小結
- DOM節點的種類有哪些?
- js判斷dom節點是否存在JS
- Spring中基於XML方式的AOP操作SpringXML
- XML DOM(Document Object Model)XMLObject
- Python XML解析之DOMPythonXML
- python可以對excel進行那些操作PythonExcel
- dom節點和vue中template淺談Vue
- 監聽Dom節點變化 - Mutation ObserverServer
- js中dom節點刪除remove方法JSREM
- XML基本操作-建立(DOM和LOINQ)和LINQ查詢和儲存XML
- Spring基於XML方式的使用SpringXML
- [譯] 探索 Angular 使用 ViewContainerRef 操作 DOMAngularViewAI
- 在使用 selenium grid 在 node 節點執行時,對於非 input 框檔案上傳操作無效
- 使用nodejs對Marketing Cloud的contact主資料進行修改操作NodeJSCloud