使用jaxp進(jìn)行dom解析_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
1.javax.xml.parsers 包中的DocumentBuilderFactory用于創(chuàng)建DOM模式的解析器對(duì)象 , DocumentBuilderFactory是一個(gè)抽象工廠類,它不能直接實(shí)例化,但該類提供了一個(gè)newInstance方法 ,這個(gè)方法會(huì)根據(jù)本地平臺(tái)默認(rèn)安裝的解析器,自動(dòng)創(chuàng)建一個(gè)工廠的對(duì)象并返回
2.調(diào)用 DocumentBuilderFactory.newInstance() 方法得到創(chuàng)建 DOM 解析器的工廠。
3.調(diào)用工廠對(duì)象的 newDocumentBuilder方法得到 DOM 解析器對(duì)象。
4.調(diào)用 DOM 解析器對(duì)象的 parse() 方法解析 XML 文檔,得到代表整個(gè)文檔的 Document 對(duì)象,進(jìn)行可以利用DOM特性對(duì)整個(gè)XML文檔進(jìn)行操作了。
案例1.遍歷xml文件中跟節(jié)點(diǎn)下面的所有子節(jié)點(diǎn).
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文件內(nèi)容如下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>
<!-- 對(duì)java.xml文件進(jìn)行CRUD的操作 -->
<!-- 節(jié)點(diǎn)
nodeName nodeValue nodeType
element 標(biāo)簽名 null 1
Attr 屬性名 屬性值 2
text #text 文本的值 3
-->
3.遍歷xml文件的操作
//1.獲取XML的根節(jié)點(diǎn)對(duì)象
@Test
public void test() throws ParserConfigurationException, SAXException, IOException{
//調(diào)用 DocumentBuilderFactory.newInstance() 方法得到創(chuàng)建 DOM 解析器的工廠
DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
//調(diào)用工廠對(duì)象的 newDocumentBuilder方法得到 DOM 解析器對(duì)象
DocumentBuilder builder = builderFactory.newDocumentBuilder();
//通過文件的方式獲取Document對(duì)象
/*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()獲取根節(jié)點(diǎn)的元素對(duì)象
Element root = document.getDocumentElement();
//遍歷根節(jié)點(diǎn)下面的所有子節(jié)點(diǎn)
listNodes(root);
}
2.遍歷節(jié)點(diǎn)對(duì)象的方法
/**
* 遍歷根據(jù)節(jié)點(diǎn)對(duì)象下面的所有的節(jié)點(diǎn)對(duì)象
* @param node
*/
public void listNodes(Node node) {
// 節(jié)點(diǎn)是什么類型的節(jié)點(diǎn)
if (node.getNodeType() == Node.ELEMENT_NODE) {// 判斷是否是元素節(jié)點(diǎn)
Element element = (Element) node;
//判斷此元素節(jié)點(diǎn)是否有屬性
if(element.hasAttributes()){
//獲取屬性節(jié)點(diǎn)的集合
NamedNodeMap namenm = element.getAttributes();//Node
//遍歷屬性節(jié)點(diǎn)的集合
for(int k=0;k<namenm.getLength();k++){
//獲取具體的某個(gè)屬性節(jié)點(diǎn)
Attr attr = (Attr) namenm.item(k);
System.out.println("name:::"+attr.getNodeName()+" value::"
+attr.getNodeValue()+" type::"+attr.getNodeType());
}
}
//獲取元素節(jié)點(diǎn)的所有孩子節(jié)點(diǎn)
NodeList listnode = element.getChildNodes();
//遍歷
for (int j = 0; j < listnode.getLength(); j++) {
//得到某個(gè)具體的節(jié)點(diǎn)對(duì)象
Node nd = listnode.item(j);
System.out.println("name::" + nd.getNodeName() + " value:::"
+ nd.getNodeValue() + " type:::" + nd.getNodeType());
//重新調(diào)用遍歷節(jié)點(diǎn)的操作的方法
listNodes(nd);
}
}
}
4.查詢某個(gè)節(jié)點(diǎn)對(duì)象(簡(jiǎn)單列舉一些案例)
/**
* 根據(jù)標(biāo)簽的名稱查找所有該名稱的節(jié)點(diǎn)對(duì)象
*/
public void findNode(Document document) {
//根據(jù)標(biāo)簽名稱獲取該名稱的所有節(jié)點(diǎn)對(duì)象
NodeList nodelist = document.getElementsByTagName("teacher");
//遍歷
for (int i = 0; i < nodelist.getLength(); i++) {
//得到具體的某個(gè)節(jié)點(diǎn)對(duì)象
Node node = nodelist.item(i);
System.out.println(node.getNodeName());
}
}
/**
* 根據(jù)屬性的值 查詢某個(gè)節(jié)點(diǎn)對(duì)象
* 屬性值是唯一(假設(shè))
* @param document
* @param value
* @return
*/
public Node findNodeByAttrValue(Document document, String value) {
//根據(jù)標(biāo)簽名稱獲取該名稱的節(jié)點(diǎn)對(duì)象集合
NodeList nodelist = document.getElementsByTagName("teacher");
//遍歷
for (int i = 0; i < nodelist.getLength(); i++) {
//獲取某個(gè)具體的元素節(jié)點(diǎn)對(duì)象
Element node = (Element) nodelist.item(i);
//根據(jù)屬性名稱獲取該節(jié)點(diǎn)的屬性節(jié)點(diǎn)對(duì)象
Attr attr = node.getAttributeNode("name");
//獲取屬性節(jié)點(diǎn)的值是否給指定的節(jié)點(diǎn)屬性值相同
if (attr.getNodeValue().equals(value)) {
//返回此節(jié)點(diǎn)
return node;
}
}
return null;
}
/**
* 根據(jù)id獲取某個(gè)節(jié)點(diǎn)對(duì)象
*
* @param document
* @param id
* @return
*/
public Node findNodeById(Document document, String id) {
return document.getElementById(id);
}
5.刪除指定的節(jié)點(diǎn)對(duì)象
/**
* 刪除某個(gè)節(jié)點(diǎn)對(duì)象
*
* @param document
* @param id
* @throws TransformerException
*/
public void deleteNodeById(Document document, String id)
throws TransformerException {
//獲取刪除的節(jié)點(diǎn)對(duì)象
Node node = document.getElementById(id);
// 是通過父節(jié)點(diǎn)調(diào)用removeChild(node)把子節(jié)點(diǎn)給刪除掉
Node node1 = node.getParentNode().removeChild(node);
//創(chuàng)建TransformerFactory對(duì)象
TransformerFactory transformerFactory = TransformerFactory
.newInstance();
//Transformer類用于把代表XML文件的Document對(duì)象轉(zhuǎn)換為某種格式后進(jìn)行輸出
//Transformer對(duì)象通過TransformerFactory獲得
Transformer transformer = transformerFactory.newTransformer();
// 把Document對(duì)象又重新寫入到一個(gè)XML文件中。
transformer.transform(new DOMSource(document), new StreamResult(
new File("src//a.xml")));
}
6.更新某個(gè)節(jié)點(diǎn)對(duì)象
/**
* 更新某個(gè)節(jié)點(diǎn)
*
* @param document
* @param id
* @throws TransformerException
*/
public void updateNodeById(Document document, String id)
throws TransformerException {
//根據(jù)id獲取元素指定的元素節(jié)點(diǎn)對(duì)象
Element node = document.getElementById(id);
//獲取元素節(jié)點(diǎn)的id屬性節(jié)點(diǎn)對(duì)象
Attr attr = node.getAttributeNode("id");
//修改元素節(jié)點(diǎn)的屬性值
attr.setValue("x122");
//獲取該節(jié)點(diǎn)對(duì)象的所有孩子節(jié)點(diǎn)對(duì)象name、age、sex節(jié)點(diǎn)
NodeList nodelist = node.getChildNodes();
//遍歷
for (int i = 0; i < nodelist.getLength(); i++) {
//得到具體的節(jié)點(diǎn)對(duì)象
Node n = nodelist.item(i);
//判斷是否是元素節(jié)點(diǎn)對(duì)象
if (n.getNodeType() == Node.ELEMENT_NODE) {
//看是否是name節(jié)點(diǎn)
if (n.getNodeName().equals("name")) {
n.setTextContent("君君");//修改其值
} else if (n.getNodeName().equals("age")) {//看看是否是age節(jié)點(diǎn)
n.setTextContent("80");//修改其值
} else if (n.getNodeName().equals("sex")) {//看看是否是sex節(jié)點(diǎn)
n.setTextContent("男");//修改其值
} else {
System.out.println("不做處理");
}
}
}
//創(chuàng)建TransformerFactory對(duì)象
TransformerFactory transformerFactory = TransformerFactory
.newInstance();
//Transformer類用于把代表XML文件的Document對(duì)象轉(zhuǎn)換為某種格式后進(jìn)行輸出
//Transformer對(duì)象通過TransformerFactory獲得
Transformer transformer = transformerFactory.newTransformer();
//把Document對(duì)象又重新寫入到一個(gè)XML文件中。
transformer.transform(new DOMSource(document), new StreamResult(
new File("src//b.xml")));
}
7.在某個(gè)節(jié)點(diǎn)的下方添加新的節(jié)點(diǎn)
/**
* 在指定的節(jié)點(diǎn)下方添加新得某個(gè)節(jié)點(diǎn)
*
* @param document
* @param id
* @throws TransformerException
*/
public void addNodeById(Document document, String id)
throws TransformerException {
//獲取要添加位置節(jié)點(diǎn)的兄弟節(jié)點(diǎn)對(duì)象
Element node = document.getElementById(id);
//獲取其父節(jié)點(diǎn)對(duì)象
Node parentNode = node.getParentNode();
//創(chuàng)建元素節(jié)點(diǎn)
Element nd = document.createElement("student");
//設(shè)置元素節(jié)點(diǎn)的屬性值
nd.setAttribute("id", "x123");
//創(chuàng)建name元素節(jié)點(diǎn)
Node name = document.createElement("name");
//設(shè)置name節(jié)點(diǎn)的文本值
name.appendChild(document.createTextNode("陳紅軍"));
//創(chuàng)建age元素節(jié)點(diǎn)
Node age = document.createElement("age");
//設(shè)置age節(jié)點(diǎn)的文本值
age.appendChild(document.createTextNode("20"));
//創(chuàng)建sex元素節(jié)點(diǎn)
Node sex = document.createElement("sex");
//設(shè)置sex節(jié)點(diǎn)的文本值
sex.appendChild(document.createTextNode("男"));
//在nd節(jié)點(diǎn)中添加3個(gè)子節(jié)點(diǎn)
nd.appendChild(name);
nd.appendChild(age);
nd.appendChild(sex);
//在父節(jié)點(diǎn)中添加nd節(jié)點(diǎn)
parentNode.appendChild(nd);
//創(chuàng)建TransformerFactory對(duì)象
TransformerFactory transformerFactory = TransformerFactory
.newInstance();
//Transformer類用于把代表XML文件的Document對(duì)象轉(zhuǎn)換為某種格式后進(jìn)行輸出
//Transformer對(duì)象通過TransformerFactory獲得
Transformer transformer = transformerFactory.newTransformer();
//把Document對(duì)象又重新寫入到一個(gè)XML文件中。
transformer.transform(new DOMSource(document), new StreamResult(
new File("src//c.xml")));
}
通過以上方法的練習(xí)希望你對(duì)xml的DOM解析有個(gè)入門的了解.
總結(jié)
以上所述是小編給大家介紹的使用jaxp進(jìn)行dom解析_,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
SpringBoot使用Shiro實(shí)現(xiàn)動(dòng)態(tài)加載權(quán)限詳解流程
本文小編將基于?SpringBoot?集成?Shiro?實(shí)現(xiàn)動(dòng)態(tài)uri權(quán)限,由前端vue在頁(yè)面配置uri,Java后端動(dòng)態(tài)刷新權(quán)限,不用重啟項(xiàng)目,以及在頁(yè)面分配給用戶?角色?、?按鈕?、uri?權(quán)限后,后端動(dòng)態(tài)分配權(quán)限,用戶無需在頁(yè)面重新登錄才能獲取最新權(quán)限,一切權(quán)限動(dòng)態(tài)加載,靈活配置2022-07-07
SpringBoot如何實(shí)現(xiàn)word文檔轉(zhuǎn)pdf
這篇文章主要介紹了SpringBoot如何實(shí)現(xiàn)word文檔轉(zhuǎn)pdf,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07
Spring中@Async用法詳解及簡(jiǎn)單實(shí)例
這篇文章主要介紹了Spring中@Async用法詳解及簡(jiǎn)單實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-02-02
新手學(xué)習(xí)JQuery基本操作和使用案例解析
這篇文章主要介紹了新手學(xué)習(xí)JQuery基本操作和使用案例解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-02-02
Java8特性之用Stream流代替For循環(huán)操作詳解
這篇文章主要介紹了Stream流代替For循環(huán)進(jìn)行輸出,這樣可以使代碼更簡(jiǎn)潔,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-09-09
Java時(shí)間類Date類和Calendar類的使用詳解
這篇文章主要介紹了Java時(shí)間類Date類和Calendar類的使用詳解,需要的朋友可以參考下2017-08-08
Netty分布式編碼器及寫數(shù)據(jù)事件處理使用場(chǎng)景
這篇文章主要為大家介紹了Netty分布式編碼器及寫數(shù)據(jù)事件處理使用場(chǎng)景剖析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,2022-03-03
基于OpenID?Connect及Token?Relay實(shí)現(xiàn)Spring?Cloud?Gateway
這篇文章主要介紹了基于OpenID?Connect及Token?Relay實(shí)現(xiàn)Spring?Cloud?Gateway,Spring?Cloud?Gateway旨在提供一種簡(jiǎn)單而有效的方式來路由到API,并為API提供跨領(lǐng)域的關(guān)注點(diǎn),如:安全性、監(jiān)控/指標(biāo)和彈性2022-06-06

