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>
<!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
- -->
<?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
-->
3.遍歷xml文件的操作
//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);
- }
@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);
- }
- }
- }
/**
* 遍歷根據節點對象下面的所有的節點對象
* @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);
- }
/**
* 根據標籤的名稱查找所有該名稱的節點對象
*/
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")));
- }
/**
* 刪除某個節點對象
*
* @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")));
- }
/**
* 更新某個節點
*
* @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")));
- }
/**
* 在指定的節點下方添加新得某個節點
*
* @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解析有個入門的瞭解.