1,主要內容
<?xml version="1.0" encoding="UTF-8"?>
<中國>
<北京>
<海淀></海淀>
<豐臺></豐臺>
</北京>
<廣東>
<廣州></廣州>
<東莞></東莞>
</廣東>
<湖北>
<武漢></武漢>
<襄陽></襄陽>
</湖北>
</中國>
如:<?xml version=“1.0” encoding=“GB2312”?>
如:<?xml version=“1.0” standalone=“yes”?>
第一段:
<中國><北京/></中國>
第二段: 給人看的
<中國>\r\n
\t <北京/>
</中國>
命名規範
<mytag name="value"/>
<mytag>
<name>
<firstname></firstnamename>
<secondname></secondname>
</name>
</mytag>
註釋
<!--大段註釋
……
<!--局部註釋--> Wrong
……
-->
<![CDATA[
<itcast>www.itcast.cn</itcast>
]]>
以上紅色部分被當做普通文本而不是標籤
7,特殊字符
8,處理指令
xml-stylesheet指令
<?xml-stylesheet type=“text/css” href=“some.css”?>
注:對中文命名的標籤元素不起作用
9,xml約束概述
爲什麼需要約束?
文件清單:book.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE 書架 SYSTEM "book.dtd">
<書架>
<書>
<書名>Java就業培訓教程</書名>
<作者>張孝祥</作者>
<售價>39.00元</售價>
</書>
<書>
<書名>JavaScript網頁開發</書名>
<作者>張孝祥</作者>
<售價>28.00元</售價>
</書>
</書架>
DTD文件應使用UTF-8或Unicode
文件清單:book.dtd
<!ELEMENT 書架 (書+)>
<!ELEMENT 書 (書名,作者,售價)>
<!ELEMENT 書名 (#PCDATA)>
<!ELEMENT 作者 (#PCDATA)>
<!ELEMENT 售價 (#PCDATA)>
xml 內部編寫DTD
DTD約束即可以作爲一個單獨的文件編寫,也可以在XML文件內編寫。(單獨的DTD文件要以UTF-8保存)
在XML 文檔中編寫DTD示例
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE 書架 [
<!ELEMENT 書架 (書+)>
<!ELEMENT 書 (書名,作者,售價)>
<!ELEMENT 書名 (#PCDATA)>
<!ELEMENT 作者 (#PCDATA)>
<!ELEMENT 售價 (#PCDATA)>
]>
<書架>
<書>
<書名>Java就業培訓教程</書名>
<作者>張孝祥</作者>
<售價>39.00元</售價>
</書>
...
</書架>
引入外部DTD文檔
<!DOCTYPE 根元素 SYSTEM “DTD文檔路徑”>
如:<!DOCTYPE 書架 SYSTEM “book.dtd”>
<!DOCTYPE 根元素 PUBLIC “DTD名稱” “DTD文檔的URL”>
如:<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
11,DTD約束語法細節
元素定義1
<!ELEMENT 元素名稱元素類型>
<!ELEMENT 書 (書名,作者,售價)>
<!ELEMENT 書名 (#PCDATA)>
ANY:表示元素內容爲任意類型
PCDATA
CDATA
CDATA 是不會被解析器解析的文本。在這些文本中的標籤不會被當作標記來對待,其中的實體也不會被展開
元素定義2
<!ELEMENT MYFILE (TITLE|AUTHOR|EMAIL)>
+: 一次或多次 (書+)
?: 0次或一次 (書?)
*: 0次或多次 (書*)
<!ELEMENT MYFILE ((TITLE*, AUTHOR?, EMAIL)* | COMMENT)>
attribute 屬性定義
<!ATTLIST 元素名
屬性名1 屬性值類型設置說明
屬性名2 屬性值類型設置說明
……
>
<!ATTLIST 商品
類別 CDATA #REQUIRED
顏色 CDATA #IMPLIED
>
<商品類別="服裝" 顏色="黃色">…</商品>
<商品類別="服裝">…</商品>
<!ATTLIST頁面作者
姓名 CDATA #IMPLIED
年齡 CDATA #IMPLIED
聯繫信息 CDATA #REQUIRED
網站職務 CDATA #FIXED "頁面作者"
個人愛好 CDATA "上網"
>
常用屬性值類型
屬性值類型àENUMERATED
<?xml version = "1.0" encoding="GB2312" standalone="yes"?>
<!DOCTYPE 購物籃 [
<!ELEMENT 肉 EMPTY>
<!ATTLIST 肉 品種 ( 雞肉 | 牛肉 | 豬肉 | 魚肉 ) "雞肉">
]>
<購物籃>
<肉 品種 ="魚肉"/>
<肉 品種 ="牛肉 "/>
<肉/>
</購物籃>
屬性值類型 ID
<?xml version = "1.0" encoding="GB2312" ?>
<!DOCTYPE 聯繫人列表[
<!ELEMENT 聯繫人列表 ANY>
<!ELEMENT 聯繫人 (姓名,EMAIL)>
<!ELEMENT 姓名 (#PCDATA)>
<!ELEMENT EMAIL (#PCDATA)>
<!ATTLIST 聯繫人 編號 ID #REQUIRED>
]>
<聯繫人列表>
<聯繫人 編號="a1">
<姓名>張三</姓名>
<EMAIL>[email protected]</EMAIL>
</聯繫人>
<聯繫人 編號="b1">
<姓名>李四</姓名>
<EMAIL>[email protected]</EMAIL>
</聯繫人>
</聯繫人列表>
實體定義
引用實體
&實體名稱;
<!ENTITY shit"oh, holy shit">
……
&shit;
參數實體
<!ENTITY % 實體名稱 "實體內容" >
%實體名稱;
<!ENTITY % TAG_NAMES "姓名 | EMAIL | 電話 | 地址">
<!ELEMENT 個人信息 (% TAG_NAMES; | 生日)>
<!ELEMENT 客戶信息 (% TAG_NAMES; | 公司名)>
舉例2
<!ENTITY % common.attributes
" id ID #IMPLIED
account CDATA #REQUIRED "
>
...
<!ATTLIST purchaseOrder %common.attributes;>
<!ATTLIST item %common.attributes;>
12 XML編程(CRUD)
java 解析xml概述
JAXP
使用JAXP進行DOM解析
javax.xml.parsers 包中的DocumentBuilderFactory用於創建DOM模式的解析器對象 , DocumentBuilderFactory是一個抽象工廠類,它不能直接實例化,但該類提供了一個newInstance方法,這個方法會根據本地平臺默認安裝的解析器,自動創建一個工廠的對象並返回
獲得JAXP中的DOM解析器
SAXParserFactoryspf = SAXParserFactory.newInstance();
SAXParser sp = spf.newSAXParser();
XMLReaderxmlReader = sp.getXMLReader();
xmlReader.setContentHandler(new BookParserHandler());
xmlReader.parse("book.xml");
DOM4J解析XML文檔
1.讀取XML文件,獲得document對象
SAXReader reader = new
SAXReader();
Document document =
reader.read(new File("input.xml"));
2.解析XML形式的文本,得到document對象.
String text = "<members></members>";
Document document =
DocumentHelper.parseText(text);
3.主動創建document對象.
Document
document = DocumentHelper.createDocument();
//創建根節點
Element root = document.addElement("members");
節點對象
Element root = document.getRootElement();
Element element=node.element(“書名");
String text=node.getText();
List nodes = rootElm.elements("member");
for (Iterator it = nodes.iterator(); it.hasNext();) {
Element elm = (Element) it.next();
// do something
}
for(Iterator it=root.elementIterator();it.hasNext();){
Element element = (Element) it.next();
// do something
}
Element ageElm = newMemberElm.addElement("age");
element.setText("29");
//childElm是待刪除的節點,parentElm是其父節點
parentElm.remove(childElm);
Element contentElm = infoElm.addElement("content");
contentElm.addCDATA(diary.getContent());
節點對象屬性
Element root=document.getRootElement();
//屬性名name
Attribute
attribute=root.attribute("size");
String text=attribute.getText();
Attribute attribute=root.attribute("size");
root.remove(attribute);
節點對象屬性
Element root=document.getRootElement();
for(Iterator it=root.attributeIterator();it.hasNext();){
Attribute attribute = (Attribute) it.next();
String text=attribute.getText();
System.out.println(text);
}
newMemberElm.addAttribute("name", "sitinspring");
Attribute attribute=root.attribute("name");
attribute.setText("sitinspring");
將文檔寫入XML文件
XMLWriter writer = new XMLWriter(new FileWriter("output.xml"));
writer.write(document);
writer.close();
OutputFormat format = OutputFormat.createPrettyPrint();
// 指定XML編碼
format.setEncoding("GBK");
XMLWriter writer = new
XMLWriter(new
FileOutputStream("output.xml"),format);
writer.write(document);
writer.close();
字符串與xml的轉換
String text = "<members> <member>sitinspring</member></members>";
Document document =
DocumentHelper.parseText(text);
SAXReader reader = new
SAXReader();
Document document =
reader.read(new File("input.xml"));
Element root=document.getRootElement();
String docXmlText=document.asXML();
String rootXmlText=root.asXML();
Element memberElm=root.element("member");
String memberXmlText=memberElm.asXML();
pull解析器
XML約束之Schema
<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.itcast.cn"
elementFormDefault="qualified">
<xs:element name='書架' >
<xs:complexType>
<xs:sequence maxOccurs='unbounded' >
<xs:element name='書' >
<xs:complexType>
<xs:sequence>
<xs:element name='書名' type='xs:string' />
<xs:element name='作者' type='xs:string' />
<xs:element name='售價' type='xs:string' />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
<?xml version="1.0" encoding="UTF-8"?>
<itcast:書架 xmlns:itcast="http://www.itcast.cn"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=“http://www.itcast.cn book.xsd">
<itcast:書>
<itcast:書名>JavaScript網頁開發</itcast:書名>
<itcast:作者>張孝祥</itcast:作者>
<itcast:售價>28.00元</itcast:售價>
</itcast:書>
</itcast:書架>
名稱空間的概念<itcast:書架 xmlns:itcast=“http://www.itcast.cn”>
<itcast:書>……</itcast:書>
</itcast:書架>
此處使用itcast來指向聲明的名稱,以便於後面對名稱空間的引用。
<itcast:書架 xmlns:itcast="http://www.itcast.cn"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=“http://www.itcast.cn book.xsd">
基本格式:
xmlns="URI"
舉例:
<書架 xmlns="http://www.it315.org/xmlbook/schema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=“http://www.itcast.cn book.xsd">
<書>
<書名>JavaScript網頁開發</書名>
<作者>張孝祥</作者>
<售價>28.00元</售價>
</書>
<書架>
使用名稱空間引入多個XML Schema文檔
文件清單:xmlbook.xml
<?xml version="1.0" encoding="UTF-8"?>
<書架 xmlns="http://www.it315.org/xmlbook/schema"
xmlns:demo="http://www.it315.org/demo/schema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.it315.org/xmlbook/schema http://www.it315.org/xmlbook.xsd
http://www.it315.org/demo/schema http://www.it315.org/demo.xsd">
<書>
<書名>JavaScript網頁開發</書名>
<作者>張孝祥</作者>
<售價 demo:幣種=”人民幣”>28.00元</售價>
</書>
</書架>
不使用名稱空間引入XML Schema文檔
文件清單:xmlbook.xml
<?xml version="1.0" encoding="UTF-8"?>
<書架 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="xmlbook.xsd">
<書>
<書名>JavaScript網頁開發</書名>
<作者>張孝祥</作者>
<售價>28.00元</售價>
</書>
</書架>
在XML Schema文檔中聲明名稱空間
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www. itcast.cn"
elementFormDefault="qualified">
<xs:schema>
elementFormDefault元素用於指定,該schema文檔中聲明的根元素及其所有子元素都屬於targetNamespace所指定的名稱空間