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"?>
- 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);
}
}
}