XML是什麼?
XML的全稱是EXtensible Markup Language (可擴展標記語言)。
編寫XML就是編寫標籤,與HTML非常類似,擴展名爲.xml
如:
// demo.xml
<employee>
<name>李思</name>
<age>18</age>
<height>170</height>
</employee>
XML VS HTML
- 二者非常相似,都是編寫標籤。
- XML沒有預定義標籤,HTML存在大量的預定義標籤。
- XML重在保存和傳輸數據,而HTML用於顯示信息。
XML的用途
- 配置文件。
- 保存程序產生的數據。
- 網絡間的數據傳輸。
XML文檔結構
- 第一行必須是XML聲明。
- 有且只有一個根節點。
- XML標籤的書寫規則與HTML相同。
XML聲明
XML聲明說明XML文檔的基本信息,包括版本號與字符集,寫在XML第一行。
<?xml version="1.0" encoding="utf-8"?>
<!-- 註釋的寫法 -->
<company>
<employee>
<name no="210">李思</name>
<age>18</age>
<department>
<dname>研發部</dname>
<address>西溪八方城</address>
</department>
</employee>
<employee>
<name no="210">王五</name>
<age>20</age>
<department>
<dname>設計部</dname>
<address>阿里事業部</address>
</department>
</employee>
</company>
在瀏覽器中可打開查看:
XML聲明
XML標籤書寫規則
-
合法的標籤名
標籤名要有意義。
建議使用英文,小寫字母,單詞之間使用-分割
建議多級標籤之間不要存在重名的情況。
-
適當的註釋與縮進
可以讓XML更容易閱讀。
-
合理使用屬性
標籤屬性用於描述標籤不可或缺的信息。
對標籤分組或者爲標籤設置id時常用屬性表示。
-
特殊字符與CDATA標籤
標籤體中,出現 < >這樣的字符,會破壞文檔結構。
解決方法1:使用實體引用
適合特殊符號比較少的情況。
解決方法2:使用CDATA標籤
CDATA指的是不應由XML解析器進行解析的文本數據。
從 <![CDATA[ 開始,到 ]]> 結束
使用CDATA標籤
-
有序的子元素
在XML多層嵌套的子元素中,標籤前後順序應保持一致。
XML語義約束
XML文檔結構正確,但可能不是有效的。
例如:員工檔案XML中絕不允許出現“植物品種”標籤。XML語義約束就是用於規定XML文檔中允許出現哪些元素。
XML語義約束有兩種定義方式:DTD與XML Schema。
DTD( Document Type Definition)
DTD(文檔類型定義)是一種簡單易用的語義約束方式。
DTD文件的擴展名爲.dtd
1、 DTD定義節點
利用DTD中的<!ELEMENT>標籤,我們可以定義XML中允許出現的節點及數量,以hr.xml爲例:
DTD定義節點數量
如某個子節點需要多次重複出現,則需要在子節點後增加相應的描述符。
XML引用DTD文件
在XML文件中使用<!DOCTYPE>標籤來引用DTD文件。
創建DTD文件
hr.dtd文件
<?xml version="1.0" encoding="UTF-8" ?>
<!ELEMENT company (employee+)>
<!ELEMENT employee (name,age,department) >
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT department (dname,address)>
<!ELEMENT dname (#PCDATA)>
<!ELEMENT address (#PCDATA)>
<!ATTLIST name no CDATA "">
hr.xml
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE company SYSTEM "hr.dtd">
<!-- 註釋的寫法 -->
<company>
<employee>
<name no="210">李思</name>
<age>18</age>
<department>
<dname>研發部</dname>
<address>西溪八方城</address>
</department>
</employee>
<employee>
<name no="210">王五</name>
<age>20</age>
<department>
<dname>設計部</dname>
<address>阿里事業部</address>
</department>
</employee>
</company>
2、 XML Schema
- XML Schema比DTD更復雜,提供了更多功能。
- XML Schema提供了數據雷類型、格式限定、數據範圍等特效。
- XML Schema是W3C標準。
DOM文檔對象模型
DOM (Document Object Model) 定義了訪問和操作XML文檔的標準方法,DOM把XML文檔作爲樹結構來查看,能夠通過DOM樹來讀寫所有元素。
Dom4j
- Dom4j是一個用於解析XML的庫,應用於java平臺,具有性能優異、功能強大和易使用的特點
- Dom4j將XML視爲Document對象。
- XML標籤將Dom4j定義爲Element對象。
1、Dom4j遍歷XML
1.1 下載Dom4j的jar包
1.2 將jar包添加到工程
1.3 創建測試類 HrReader.java
package dom4j;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.util.List;
public class HrReader {
public void readXml() {
String file = "D:\\study\\player\\src\\hr.xml";
SAXReader reader = new SAXReader();
try {
Document doc = reader.read(file);
// 獲取XML文檔節點的根節點
Element root = doc.getRootElement();
List<Element> employees = root.elements("employee");
for (Element employee :employees) {
Element name = employee.element("name");
String empName = name.getText();// getText()方法用於獲取標籤文本
System.out.println(empName);
System.out.println(employee.elementText("age"));
// System.out.println(employee.elementText("salary"));
Element department = employee.element("department");
System.out.println(department.element("dname").getText());
System.out.println(department.element("address").getText());
Attribute att = name.attribute("no");
System.out.println(att.getText());
}
} catch (DocumentException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
HrReader reader = new HrReader();
reader.readXml();
}
}
2、利用Dom4j更新XML
創建HRWriter.java
package dom4j;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.util.List;
public class HrReader {
public void readXml() {
String file = "D:\\study\\player\\src\\hr.xml";
SAXReader reader = new SAXReader();
try {
Document doc = reader.read(file);
// 獲取XML文檔節點的根節點
Element root = doc.getRootElement();
List<Element> employees = root.elements("employee");
for (Element employee :employees) {
Element name = employee.element("name");
String empName = name.getText();// getText()方法用於獲取標籤文本
System.out.println(empName);
System.out.println(employee.elementText("age"));
// System.out.println(employee.elementText("salary"));
Element department = employee.element("department");
System.out.println(department.element("dname").getText());
System.out.println(department.element("address").getText());
Attribute att = name.attribute("no");
System.out.println(att.getText());
}
} catch (DocumentException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
HrReader reader = new HrReader();
reader.readXml();
}
}
XPath路徑表達式
- XPath路徑表達式時XML文檔中查找數據的語言。
- XPath可以極大的提高在提取數據時的開發效率。
- XPath本質就是掌握各種形式表達式的使用技巧。
1、XPath基本表達式
XPath常用的基本表達式
XPath基本表達式案例
2、XPath謂語表達式
Jaxen
- Jaxen是一個java編寫的XPath庫。這是適應多種不同的對象模型,包括DOM、XOM、dom4j、JDOM。
- Dom4j底層依賴Jaxen實現XPath查詢
- Jaxen下載地址 : 下載
測試XPath
XPathTest .java
package dom4j;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
import java.util.List;
public class XPathTest {
public void xpath(String xpathExp){
String file = "D:\\study\\player\\src\\hr.xml";
SAXReader reader = new SAXReader();
try {
Document document = reader.read(file);
List<Node> nodes = document.selectNodes(xpathExp);
for (Node node :nodes){
Element ele = (Element) node;
System.out.println(ele.elementText("name"));
System.out.println(ele.elementText("age"));
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
XPathTest test = new XPathTest();
// test.xpath("/company/employee");
// test.xpath("//employee");
// test.xpath("//employee[age<20]");
// test.xpath("//employee[name='李思']");
// test.xpath("//employee[1]");
test.xpath("//employee[last()]");
}
}