XML(Extensible Markup Language):可擴展標記語言,w3c組織發佈,目前遵循2000年發佈的XML1.0規範!
XML文件分爲:文檔聲明、元素、屬性、註釋、CDATA區、特殊字符、處理指令
(processing introduction)
文檔聲明:<?xml version=”1.0” encoding=”GB2312” standalone=”yes”?>
standalone說明文檔是否獨立。
XML元素:XML文件中出現的標籤,一個標籤分爲開始標籤和結束標籤。
格式良好的XML文檔必須有且僅有一個根標籤,其他標籤都是這個根標籤的子孫標籤。
一個XML元素可以包含字母、數字以及其他一些可見字符,但必須遵守:
1、 區分大小寫
2、 不能以數字或“_”(下劃線)開頭
3、 不能以xml或XML、Xml開頭
4、 不能包含空格
5、 名稱中間不能包含(:)
Tip:屬性
Xml文件註釋:“<!—註釋-->”
Tip:CDATA區:在編寫XML文件時,有些內容可能不想讓解析引擎解析執行,而是當做原始內容處理,可以把這些內容放在CDATA區裏,對於CDATA區的內容,XML解析引擎不會處理,而是原封不動的輸出。
語法:<![CDATA[內容]]>
Tip:轉義字符:
&(&)、<(&it)、>(>)、”(")、’(&apos)
Tip:處理指令:簡稱PI(processing introduction),用來指揮解析引擎如何解析XML文檔內容。
如:<?xml-stylesheet type=”text/css” href=”1.css”?>---通知解析引擎,應用css文件顯示xml文檔內容。
XML聲明語句就是最常見的一種處理指令。
Tip:XML約束:在XML技術裏,可以編寫一個文檔來約束一個XML文檔的書寫規範,這稱之爲XML約束。
常用的約束技術:XML DTD(Document Type Definition,文檔類型定義)、XML Schema
檢查DTD正確性:可以直接用eclipse校驗。
XML編程(C--create R—read U—update D—delete):
XML解析方式有兩種:dom(Document Object Model—文檔對象模型,適合增刪改查,耗內存)、sax(Simple API for XML,佔用內存少,解析速度快,只適合做文檔的讀取,不適合增刪改查)
XML解析開發包:Jaxp(SUN)、Jdom、dom4j
調整JVM內存大小:JVM的初始內存大小是64M,超過則內存溢出
調整方式爲:啓動時在jvm的arguments里加上(-Xml80m)à即在內存開闢了80M的空間
使用Jaxp對XML文檔進行dom解析:
1、 創建工廠
2、 得到dom解析器
3、 解析XML文檔,得到代表文檔的document
publicvoid test()throws ParserConfigurationException, SAXException, IOException{
//打印XML中的所有標籤
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
DocumentBuilder builder=factory.newDocumentBuilder();
Document document=builder.parse("src/book.xml");
Node root=document.getElementsByTagName("書架").item(0);
list(root);
}
privatevoid list(Node root) {
if(rootinstanceof Element){
System.out.println(root.getNodeName());
}
NodeList list=root.getChildNodes();
for(int i=0;i<list.getLength();i++){
Node child=list.item(i);
list(child);
}
}
}
@Test//向XML文檔中添加節點:<售價>59.00元</售價>
publicvoid add()throws SAXException, IOException, ParserConfigurationException, TransformerException{
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
DocumentBuilder builder=factory.newDocumentBuilder();
Document document=builder.parse("src/book.xml");
//創建節點
Element price= document.createElement("售價");
price.setTextContent("59.00元");
//把創建的節點掛在第一本書上
Element book=(Element) document.getElementsByTagName("書").item(0);
book.appendChild(price);
//把更新後內存寫回XML文檔
TransformerFactory tffactory=TransformerFactory.newInstance();
Transformer tf=tffactory.newTransformer();
tf.transform(new DOMSource(document),new StreamResult(new FileOutputStream("src/book.xml")));
}
//向文檔中指定位置添加節點
@Test
publicvoid test2()throws ParserConfigurationException, SAXException, IOException, TransformerException{
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
DocumentBuilder builder=factory.newDocumentBuilder();
Document document=builder.parse("src/book.xml");
//創建節點
Element price=document.createElement("售價");
price.setTextContent("59.00元");
//得到參考節點
Element refNode=(Element) document.getElementsByTagName("售價").item(0);
//得到要懸掛的節點
Element book=(Element) document.getElementsByTagName("書").item(0);
//往節點指定位置插崽
book.insertBefore(price, refNode);
//把更新後內存寫回XML文檔
TransformerFactory tffactory=TransformerFactory.newInstance();
Transformer tf=tffactory.newTransformer();
tf.transform(new DOMSource(document),new StreamResult(new FileOutputStream("src/book.xml")));
}
/*
節點上添加屬性
Element bookName=(Element)document.getElementsByTagName("書名").item(0);
bookName.setAttribute("name","XXXXX");*/
/* 刪除節點
得到要刪除的節點
Element e=(Element)document.getElementBytagName("售價").item(0);
得到要刪除節點的爸爸,再刪除兒子節點
e.getParentNode().removeChild(e);*/
/* 更新
Element e=(Element)document.getElementByTagName("售價").item(0);
e.setTexttextContent("109元");*/
}
SAX解析(JAXP):
publicstaticvoid main(String[] args)throws ParserConfigurationException, SAXException, IOException{
//獲得解析工廠
SAXParserFactory factory= SAXParserFactory.newInstance();
//得到解析器
SAXParser sp=factory.newSAXParser();
//得到讀取器
XMLReader reader=sp.getXMLReader();
//設置內容處理器(implementsContenthandler或extends DefaultHandler)
reader.setContentHandler( );
//讀取XML文檔內容
reader.parse("src/book.xml");
}
}
開發中所用方法:
XML:
<?xmlversion="1.0"encoding="UTF-8"standalone="no"?><書架>
<書>
<書名 name="XXXXX">Java就業培訓教程</書名>
<作者>張孝祥</作者>
<售價>59.00元</售價>
<售價>109元</售價>
<售價>59.00元</售價></書>
<書>
<書名>JavaScript網頁開發</書名>
<作者>張孝祥</作者>
<售價>28.00</售價>
</書>
</書架>
publicstaticvoid main(String[] args) {
// 獲得解析工廠
SAXParserFactory factory = SAXParserFactory.newInstance();
// 得到解析器
SAXParser sp = factory.newSAXParser();
// 得到讀取器
XMLReader reader = sp.getXMLReader();
// 設置內容處理器(implementsContenthandler或extends DefaultHandler)
reader.setContentHandler();
// 讀取XML文檔內容
reader.parse("src/book.xml");
// 把XML文檔中的每一本書封裝到一個book對象,並把多個book對象放在一個list集合返回
class BeanListHandlerextends DefaultHandler {
privateListlist =newArrayList();
private StringcurrentTag;
private Bookbook;
@Override
publicvoid startElement(String uri, String localName, String name,
Attributes attributes)throws SAXException {
//TODO Auto-generated method stub
currentTag = name;
if ("書".equals(currentTag)) {
book =new Book();
}
}
@Override
publicvoid characters(char[] ch,int start,int length)
throws SAXException {
if ("書名".equals(currentTag)) {
String name =new String(ch, start, length);
book.setName(name);
}
if ("作者".equals(currentTag)) {
String author =new String(ch, start, length);
book.setAuthor(author);
}
if ("售價".equals(currentTag)) {
String price =new String(ch, start, length);
book.setAuthor(price);
}
}
@Override
publicvoid endElement(String uri, String localName, String qName)
throws SAXException {
if (name.equals("書")) {
list.add(book);
book =null;
}
currentTag =null;
}
publicList getList(){
returnlist;
}
}