初學Java Web——xml(二)

1. xml解析

1.1 DOM解析

xml解析器解析xml文檔時,會把xml文件的各個部門內容封裝成對象,並通過對象來操作xml文檔,這種方式就稱爲DOM解析。

1.1.1 讀取xml文件

參考以下students.xml文件:

<?xml version="1.0" encoding="utf-8"?>
<students>
    <student id="001">
        <name>xpeng_V</name>
        <gender>M</gender>
        <age>100</age>
    </student>
    <student id="002">
        <name>xiaohong</name>
        <gender>F</gender>
        <age>22</age>
    </student>
</students>

我們可以將上述xml文件想象成如下的DOM樹型結構
DOM樹


- 將上述樹形結構稱爲Document樹,樹只有一個根標籤(students)
- 樹上的分支,即節點爲Node對象
- 標籤節點封裝爲Element對象
- 屬性節點封裝爲Attribute對象
- 文本內容封裝爲Text對象


使用DOM解析xml文件,我們可以得到一個Document對象,通過Document對象就可以了得到xml文檔裏的分支,標籤,屬性和文本信息。

1.1.1.1 獲取標籤

新建工程並導入dom4j-1.6.1.jar,編寫以下代碼解析xml文件得到所有的標籤:

public class Demo2 {

    public static void main(String[] args) throws DocumentException {
        SAXReader reader = new SAXReader();
        Document document = reader.read(new File("./src/students.xml"));

        //得到根標籤
        Element root = document.getRootElement();

        getChildNodes(root);
    }

    //獲取傳入標籤的所有子節點
    private static void getChildNodes(Element e){
        System.out.println(e.getName());

        //得到子節點
        Iterator<Node> it = e.nodeIterator();
        while(it.hasNext()){
            Node node = it.next();

            //判斷是否爲標籤節點
            if(node instanceof Element){
                Element e1 = (Element)node;
                //遞歸
                getChildNodes(e1);
            }
        }
    }
}

控制檯輸出如下:

students
student
name
gender
age
student
name
gender
age

1.1.1.2 獲取屬性值

  1. 首先得到標籤對象,然後使用attributeValue(“屬性名”)得到屬性的值
    public static void main(String[] args) throws DocumentException {

        SAXReader reader = new SAXReader();
        Document document = reader.read(new File("./src/students.xml"));
        //獲取標籤對象
        Element e = document.getRootElement().element("student");
        //得到標籤的屬性
        String id = e.attributeValue("id");
        System.out.println(id);
    }
  1. 通過e.attribute(“屬性名”)得到屬性對象,然後再得到屬性的值
    public static void main(String[] args) throws DocumentException {

        SAXReader reader = new SAXReader();
        Document document = reader.read(new File("./src/students.xml"));
        //獲取標籤對象
        Element e = document.getRootElement().element("student");
        //得到屬性對象
        Attribute attr = e.attribute("id");
        System.out.println(attr.getName() + attr.getValue());
    }
  1. *當不知道標籤裏的屬性的名字和屬性的個數時
    public static void main(String[] args) throws DocumentException {

        SAXReader reader = new SAXReader();
        Document document = reader.read(new File("./src/students.xml"));
        //獲取標籤對象
        Element e = document.getRootElement().element("student");

        //返回List
        List<Attribute> list = e.attributes();
        for (Attribute attr : list) {
            System.out.println(attr.getName() + attr.getValue());
        }

        //返回Iterator
        Iterator<Attribute> it = e.attributeIterator();
        while(it.hasNext()){
            Attribute attr = it.next();
            System.out.println(attr.getName() + attr.getValue());
        }
    }

1.1.1.3 獲取文本

獲取指定子標籤中的文本

    public static void main(String[] args) throws DocumentException {

        SAXReader reader = new SAXReader();
        Document document = reader.read(new File("./src/students.xml"));
        //獲取指定子標籤中的文本
        String str = document.getRootElement().element("student").elementText("name");
        System.out.println(str);
    }

注意:空格和換行也是xml文件中的文本,我們可以使用以下代碼得到根標籤裏的文本

String content = document.getRootElement().getText();

我們能夠發現下面兩段xml具有不一樣的含義

<name>
    AA
</name>
<name>AA</name>

1.1.2 修改和新建

以下代碼作用是將students.xml文件拷貝到E盤根目錄。


1. 使用xml解析器SAXReader將文件解析爲Document 對象
2. 創建輸出流
3. 使用XMLWriter 從計算機內存中讀取Document 對象
4. 使用write方法將內存中的對象寫到硬盤中
5. 關閉流

/**
 * 
 * @author xpeng_V
 * 
 */

public class UpdateXml {

    public static void main(String[] args) throws Exception {

        //讀取xml文件
        Document doc = new SAXReader().read(new File("./src/students.xml"));

        //創建輸出對象
        FileOutputStream out = new FileOutputStream("E:/students.xml");
        //寫出對象
        //OutputFormat format = OutputFormat.createCompactFormat();
        OutputFormat format = OutputFormat.createPrettyPrint();
        format.setEncoding("GBK");

        XMLWriter xmlWriter = new XMLWriter(out, format);
        xmlWriter.write(doc);

        //關閉流
        out.close();
    }
}

XMLWriter 類:
XMLWriter 的構造方法:

//OutputFormat format = OutputFormat.createCompactFormat();
//OutputFormat format = OutputFormat.createPrettyPrint();
XMLWriter xmlWriter = new XMLWriter(OutputStream out, OutputFormat format)

其中createCompactFormat會去掉xml文件出聲明之外的空格和換行,createPrettyPrint會顯示空格和換行。注意這兩種方式生成的xml文檔是不同的。因爲第一種方式有空格和換行所以會佔據較大的空間,所以在適當的時候選擇對應的格式。

format.setEncoding(“utf-9”) 同時設置了xml文件聲明的編碼和文件保存的編碼。

1.2 SAX解析

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