3.1XML解析

(xml的增刪改查)
1:XML的使用範圍
2:XML的聲明
    文檔類型定義:(用於驗證XML文件中的元素類型是否合法)
        DTD:
        XSD:Xml Schema
3:XML的組成
    XML中也是由節點來組成。
    根節點        Root節點
    元素節點    Element節點
    屬性節點    Attribute節點
    文本節點    Text節點
    註釋節點    Comment節點
    CDATA節點。   
    文檔節點:    document節點
4:特殊字符
    HTML 空格。     
         &        &
    XML
         A:轉義字符。與HTML中的轉義字符一樣。
         B:CDATA節點。

5:XML的解析:
    服務端解析
        JDK:
            DOM
            SAX
            JAXB    java and xml Binding
        開源
            JDOM   
            DOM4J:hibernate框架就是使用dom4j來解析映射文件。
            X-Stream:java跟XML之間轉換的工具(java轉成xml文件/字符串,
                              xml文件/字符串轉爲java對象)
         DOM/SAX/JDom/Dom4J之間的區別:
 DOM/JDom:將XML文件中的內容一次性的讀取到內存中。讀取數據量比較少的數據有優勢。
 SAX:      基於事件的驅動。讀取數據量比較大的XML文件。

 解析XML的步驟:
    A:獲取解析器
    B:解析XML文件。
    C:獲取Document文檔對象
    D:獲取根節點
    E:通過根節點來操作底下的子節點。
 DOM4J
      Reader
       DomReader
       SaxReader
           CDATA節點的修改:
       先刪除再添加。
6、 

Dom4J的使用:

1、導入dom4j的jar包:dom4j-1.6.1.jar

2.、具體使用

1)獲得解析器:

SAXReader reader=new SAXReader();

2)解析器解析文件,獲得文檔對象

Document doc=reader.read(new File("src/book.xml"));

3)獲得要元素:

Element root=doc.getRootElement();

--Element中的方法:

getName():獲得標籤名。

getText()獲得標籤之間的內容。

elementText("標籤名"):根據標籤名獲得孩子節點的內容。

attributeValue("屬性名"):根據屬性名獲得屬性值。

attributeIterator()獲得該元素下的屬性迭代器。

elementIterator()獲得子元素迭代器。

--Attribute中的方法:

getName():獲得屬性名。

getValue():獲得屬性值。

3.寫xml文件保存到本地:

1.創建文檔對象:

Document doc=DocumentHelper.createDocument();

2.在文檔對象中創建根元素

Element root=doc.addElement("標籤名");

3.往根中增加元素

Element book=root.addElement("boot");

4.設置標籤中的文本

book.setText("thinking in java");

5.設置標籤中屬性及屬性值

boot.addAttribute("id","123");

6.文檔對象寫入文件

FileWriter filewriter=new FileWriter(new File("src/mybook.xml"));

          4.設置格式:

OutputFormat xmlFormat=OutputFormat.createPrettyPrint();

xmlFormat.serEncoding("utf-8");

XMLWriter xmlWriter=new XMLWriter(fileWriter,xmlFormat);

寫入文件

xmlWriter.write(doc);

關閉流

xml.writer.close();

filewriter.close();

                    5.xml的修改:需要讀取xml文件然後根據修改構建一份新的xml寫入到本地覆蓋原來的。

7、例子代碼

package com.test;

import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.util.List;

import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

public class TestXML {
	public static void main(String[] args) {
		TestXML testXML = new TestXML();
		// testXML.readXML();
		// testXML.addXML();
		// testXML.deleteXML();
		testXML.updateXML();
	}

	private void readXML() {
		/**
		 * XML的解析的標準步驟
		 * 
		 * 1:創建一個XML的解析器。
		 * 
		 * 2:解析器解析XML文件,返回一個Document的元素節點。
		 * 
		 * 3:通過Document來獲取一個根節點的對象。
		 * 
		 * 4:通過根節點來獲取底下的子節點。
		 */
		File xmlFile = new File(
				"D:\\WorkSpace6.5\\java1603\\Eclipse\\Xml_Project\\src\\student.xml");
		SAXReader saxReader = new SAXReader();
		try {
			Document document = saxReader.read(xmlFile);
			Element root = document.getRootElement();
			System.out.println(root.getName() + "\t" + root.getNodeTypeName());
			List<Element> childList = root.elements();
			System.out.println(childList.size());

			childList = root.elements("student");
			System.out.println(childList.size());

			for (Element stuElement : childList) {
				String stu_id = stuElement.attributeValue("id");

				Element stu_nameElement = stuElement.element("stu_name");
				String stu_name = stu_nameElement.getText();
				String stu_age = stuElement.elementText("stu_age");
				String stu_sex = stuElement.elementText("stu_sex");
				String stu_content = stuElement.elementText("stu_content");
				System.out.println(stu_id + "\t" + stu_name + "\t" + stu_age
						+ "\t" + stu_sex + "\t" + stu_content);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	private void addXML() {
		File xmlFile = new File(
				"D:\\WorkSpace6.5\\java1603\\Eclipse\\Xml_Project\\src\\student.xml");
		SAXReader saxReader = new SAXReader();

		try {
			Document document = saxReader.read(xmlFile);
			Element root = document.getRootElement();
			/**
			 * 在root中添加一個student的元素節點
			 */

			// <student></student>
			Element student = root.addElement("student");
			// 在student元素添加屬性節點
			// <student id = "4"></student>
			student.addAttribute("id", "4");

			/**
			 * 在student元素下面加入stu_name節點
			 */
			Element stu_name = student.addElement("stu_name");
			stu_name.setText("王五");

			Element stu_age = student.addElement("stu_age");
			stu_age.setText("30");

			Element stu_sex = student.addElement("stu_sex");
			stu_sex.setText("男");

			Element stu_content = student.addElement("stu_content");
			stu_content.addCDATA("!@#$%^&*&^YHGKPPLKjhfd;afdsl;alsdf");

			/**
			 * 將內容重新寫回到XML文件中。
			 */
			OutputStream outputStream = new FileOutputStream(xmlFile);

			OutputFormat outputFormat = OutputFormat.createPrettyPrint();
			outputFormat.setIndent(true);
			outputFormat.setIndent("\t");

			XMLWriter xmlWriter = new XMLWriter(outputStream, outputFormat);
			xmlWriter.write(document);
			xmlWriter.flush();
			xmlWriter.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 刪除XML中的元素
	 */
	private void deleteXML() {
		File xmlFile = new File(
				"D:\\WorkSpace6.5\\java1603\\Eclipse\\Xml_Project\\src\\student.xml");

		SAXReader saxReader = new SAXReader();

		try {
			Document document = saxReader.read(xmlFile);
			Element root = document.getRootElement();
			List<Element> childList = root.elements("student");

			for (Element stuElement : childList) {
				String stu_id = stuElement.attributeValue("id");
				if (stu_id.equals("5")) {
					root.remove(stuElement);
					break;
				}
			}

			/**
			 * 將內容重新寫回到XML文件中。
			 */
			OutputStream outputStream = new FileOutputStream(xmlFile);

			OutputFormat outputFormat = OutputFormat.createPrettyPrint();
			outputFormat.setIndent(true);
			outputFormat.setIndent("\t");

			XMLWriter xmlWriter = new XMLWriter(outputStream, outputFormat);
			xmlWriter.write(document);
			xmlWriter.flush();
			xmlWriter.close();

		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	private void updateXML() {
		File xmlFile = new File(
				"D:\\WorkSpace6.5\\java1603\\Eclipse\\Xml_Project\\src\\student.xml");

		SAXReader saxReader = new SAXReader();

		try {
			Document document = saxReader.read(xmlFile);
			Element root = document.getRootElement();
			List<Element> childList = root.elements("student");

			for (Element stuElement : childList) {
				String stu_id = stuElement.attributeValue("id");
				if (stu_id.equals("2")) {
					/**
					 * 更改XML中元素節點的數據
					 */
					Element stu_name = stuElement.element("stu_name");
					Element stu_age = stuElement.element("stu_age");
					Element stu_sex = stuElement.element("stu_sex");
					Element stu_content = stuElement.element("stu_content");

					stu_name.setText("修改操作");
					stu_age.setText("20");
					stu_sex.setText("gril");
					/**
					 * 由於Dom4j中沒有提供CDATA節點修改的操作。
					 * 
					 * 變通:先刪除節點,然後再添加CDATA節點的操作
					 */
					stuElement.remove(stu_content);
					
					stu_content = stuElement.addElement("stu_content");
					stu_content.addCDATA("CDATA節點被修改了.....l.asidfuaosdf");
					break;
				}
			}

			/**
			 * 將內容重新寫回到XML文件中。
			 */
			OutputStream outputStream = new FileOutputStream(xmlFile);

			OutputFormat outputFormat = OutputFormat.createPrettyPrint();
			outputFormat.setIndent(true);
			outputFormat.setIndent("\t");

			XMLWriter xmlWriter = new XMLWriter(outputStream, outputFormat);
			xmlWriter.write(document);
			xmlWriter.flush();
			xmlWriter.close();

		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}
8、student.xml

<?xml version="1.0" encoding="UTF-8"?>

<root>
	<student id="1">
		<stu_name>aaa</stu_name>
		<stu_age>21</stu_age>
		<stu_sex>男</stu_sex>
		<stu_content>1+23</stu_content>
	</student>
	<student id="2">
		<stu_name>修改操作</stu_name>
		<stu_age>20</stu_age>
		<stu_sex>gril</stu_sex>
		<stu_content><![CDATA[CDATA節點被修改了.....l.asidfuaosdf]]></stu_content>
	</student>
	<teacher t_id="3" />
	<student id="4">
		<stu_name>admin</stu_name>
		<stu_age>10</stu_age>
		<stu_sex>男</stu_sex>
		<stu_content><![CDATA[!@#$%^&*&^YHGKPPLKjhfd;afdsl;alsdf]]></stu_content>
	</student>
	<student id="5">
		<stu_name>test</stu_name>
		<stu_age>20</stu_age>
		<stu_sex>女</stu_sex>
		<stu_content><![CDATA[!@#$%^&*&^YHGKPPLKjhfd;afdsl;alsdf]]></stu_content>
	</student>
	<student id="6">
		<stu_name>guest</stu_name>
		<stu_age>30</stu_age>
		<stu_sex>男</stu_sex>
		<stu_content><![CDATA[!@#$%^&*&^YHGKPPLKjhfd;afdsl;alsdf]]></stu_content>
	</student>
</root>




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章