認識XML

XML當今編程世界無處不在,xml文件只是一種數據的載體,不過由於這種數據載體的格式簡單易懂,加上良好的擴充性能,使得xml的用處極爲廣泛。
什麼是XML
XML是一種擴展性標識語言,它是一種能夠讓用戶自己創造的語言,可以存儲數據和共享數據。
下面是web.xml的XML:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">
    <servlet>
        <servlet-name>helloServlet</servlet-name>
        <servlet-class>servlet.HelloServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>helloServlet</servlet-name>
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>
    <servlet>
        <servlet-name>firstServlet</servlet-name>
        <servlet-class>servlet.FirstServlet</servlet-class>
        <init-param>
            <param-name>message</param-name>
            <param-value>welcome to servlet</param-value>
        </init-param>
        <!--配置爲1,tomcat啓動時加載該servlet,0,有人第一次請求才加載該servlet-->
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>firstServlet</servlet-name>
        <url-pattern>/first</url-pattern>
        <url-pattern>/first.jsp</url-pattern>
        <url-pattern>/first.asp</url-pattern>
    </servlet-mapping>
</web-app>

XML的技術架構
數據解析DOM、SAX;樣式風格XSTL

XML的基本語法(注意:大小寫敏感、空白被保留)
1. 文檔的聲明

<?xml version="1.0" encoding="UTF-8"?>
  1. xml主體部分
    1)元素:標籤之間的內容,元素下可以包含子元素
<servlet>
        <servlet-name>helloServlet</servlet-name>
        <servlet-class>servlet.HelloServlet</servlet-class>
</servlet>

2)屬性:xml元素的一部分,定義再xml元素的標籤中

<rss version="2.0">
    ...
</rss>

XML解析
要操作xml文檔,必先解析xml文檔,2種解析方式:DOM和SAX
1.DOM解析
基於對象的API,把XML內容加載生成一個與xml文檔內容對應的對象模型。當解析完,內存會生成DOM對象樹,然後就根據樹的結構,以節點的形式堆文檔進行操作

package xml;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.File;

/**
 * Created by AA on 2017/4/17.
 * DOM解析XML
 */
public class DomDemo {

    public static void main(String[] args) {
        // 創建解析的xml文檔對象
        File xmlFile = new File("E:\\study\\java web\\webTest\\src\\xml\\sina.xml");
        // 聲明一個 DocumentBuilder對象. 抽象類,不能直接構建,可以通過 DocumentFactory 來構建。
        DocumentBuilder builder = null;
        // 聲明一個 DocumentBuilderFactory對象. 通過單例模式創建
        DocumentBuilderFactory builderFactory = DocumentBuilderFactory
                .newInstance();
        // 取得默認的 DocumentBuilder.
        try {
            builder = builderFactory.newDocumentBuilder();
            // 解析文件
            Document document = builder.parse(xmlFile);
            // 獲得根元素
            Element root = document.getDocumentElement();
            System.out.println("根元素:" + root.getNodeName());
//             獲得根元素下的子節點
            NodeList childNodes = root.getChildNodes();
            // 遍歷這些子節點
            for (int i = 0; i < childNodes.getLength(); i++) {
                // 對每個子節點進行判斷
                Node node = childNodes.item(i);
                // 如果節點的名稱爲"article"
                if ("article".equals(node.getNodeName())) {
                    // 輸出article元素屬性category
                    System.out.println("\r\n 找到一篇文章. 所屬分類: "
                            + node.getAttributes().getNamedItem("category")
                            .getNodeValue() + ". ");
                    // 獲得<article>元素下的所有節點
                    NodeList nodeDetail = node.getChildNodes();
                    // 遍歷<article>元素下的所有節點
                    for (int j = 0; j < nodeDetail.getLength(); j++) {
                        // 獲得<article>元素每一個節點
                        Node detail = nodeDetail.item(j);
                        // 根據節點名稱解析數據
                        if ("title".equals(detail.getNodeName()))
                            System.out
                                    .println("標題: " + detail.getTextContent());
                        else if ("author".equals(detail.getNodeName()))
                            System.out
                                    .println("作者: " + detail.getTextContent());
                        else if ("email".equals(detail.getNodeName()))
                            System.out.println("電子郵件: "
                                    + detail.getTextContent());
                        else if ("date".equals(detail.getNodeName()))
                            System.out.println("發表日期: "
                                    + detail.getTextContent());
                    }
                }

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

    }
}

解剖代碼
通過以上程序可以總結DOM解析XML的流程:
1)首先通過3個步驟創建XML對應的Document對象

DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
        // 取得默認的 DocumentBuilder.
builder = builderFactory.newDocumentBuilder();
Document document = builder.parse(xmlFile);

2)取得Document對象之後通過Document的各種方法遍歷XML的內容

注意:XML解析只負責解析正確的XML,對於不合法的XML,會直接拋出解析異常

2.SAX解析
DOM的缺點就是佔用內存比較大,速度慢,對於大的XML文件不採取這種方法,針對這種現象,提出了SAX解析

一個簡單例子:
SAXDemo

package xml;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import java.io.File;

/**
 * Created by AA on 2017/4/18.
 */
public class SaxDemo {
    public static void main(String[] args) {
        File xmlFile = new File("E:\\study\\java web\\webTest\\src\\xml\\sina.xml");

        // 創建一個 SAXParserFactory對象. 通過單例模式創建
        SAXParserFactory factory = SAXParserFactory.newInstance();
        try {
            // 創建SAXParser對象
            SAXParser parser = factory.newSAXParser();
            // 解析文件,並定義解析時的事件處理
            parser.parse(xmlFile, new MySaxHandler());
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

MySaxHandler

package xml;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

import java.text.DateFormat;
import java.text.SimpleDateFormat;

/**
 * Created by AA on 2017/4/18.
 */
public class MySaxHandler extends DefaultHandler{

    static DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    private String content;
    private String tag;

    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        if ("item".equals(qName)) {
            System.out.println(qName);
        }
        tag = qName;
    }

    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {

        tag = null;
    }

    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        if (tag != null)
        content = new String(ch,start,length);
        if ("title".equals(tag)){
            System.out.println("標題:"+content);
        }
        else if ("link".equals(tag)){
            System.out.println("鏈接:"+content);
        }
        else if ("author".equals(tag)){
            System.out.println("作者:"+content);
        }
    }
}
發佈了94 篇原創文章 · 獲贊 18 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章