使用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的輸出和加強。如果有什麼錯誤或者誤差亦或是缺失,希望得到指正哈!