XML 解析XML文檔 XML約束
XML
什么是XML
- Extensible Markup Language(可擴展的標記語言)
- 他是一個語言,有自己的語法,和Java以及其他的編程無關
- “標記” 在文件中包含類似于張三 ,這種用尖括號括起來的叫標記,使用來標記數據的。標記可以嵌套,有包含、所屬關系。XML是純文本文檔,它是由“標記+數據”組成
例如:
建立文件:clases.xml
<類庫>
<屬性> </ 屬性>
< /類庫>
XML 的作用
- 存儲數據【以后數據庫存儲文件】
- 做配置文件【重點應用方式】
XML的語法
1、文檔聲明
- 一個格式化好的XML文檔,應該有一個“文檔聲明”,不是必須有
- 文檔聲明格式:
2、XML的語法_元素(標簽)
- 元素:也叫標記、標簽。
標簽分類
完整標簽:有開始標簽,和結束標簽
<name>張三</name>
單標簽:只有開始標簽,沒有結束標簽;單標簽可以通過屬性來記錄數據
<property name="id" value="it001"/>
標簽的語法
- 標簽名稱可以包含大部分的字符,包括中文
- 標簽里可以包括以下的符號:“、 _ - . ”
- 但只能以字母、下劃線、冒號開頭
標簽的內容:
- 可以是“數據”
<name>張三</name>
可以是子標簽
- 可以是“數據”
區分大小寫
3、屬性:唯一的
- 一個標簽中可以定義任意多個的“屬性”,屬性的作用:存儲數據。
語法規則
- 一個標簽可以定義0或者多個屬性,屬性名不能重名,用空格隔開
屬性的格式:屬性名=“屬性值”屬性值必須要用單引號或者雙引號括起來
(認為單引號或者雙引號里的內容是數值)屬性,必須定義在開始標簽中。
4、注釋
5、轉義字符
如果數據中包含大量的轉義字符,編寫時可讀性不好。可以使用CDATA區來標志數據。
6、解析XML文檔 兩種方式
- DOM解析:一次性將整個文檔讀取到內存中,會將內部的各種標簽已經屬性、數據等信息全部封裝到一個對象中。最終形成DOM對象,在DOM對象內容保留文檔的結構信息。優點:內存中保留文檔的結構進行修改(增加、修改、刪除元素等修改)。缺點:如果文檔很大,會占用內存。
- SAX解析:一次讀取,解析一行,讀取下一行,之前的信息會被丟掉。優點:速度快,缺點:沒有文檔結構,不能進行節點的增刪改查。
- PULL解析:用于Android系統內容不的解析方式。類型于SAX。
7、解析器
- JAXP
- JDom
- Jsoup
- dom4j:第三方開發包,內部結合了DOM和SAX解析的方式
8、解析原理 是一個創建樹的過程
XML文檔讀取到內存的過程:先創建一個DOM對象(Document);在創建一個節點Element(根元素)對象;創建子元素Element(節點)對象在根元素下面;創建屬性(Attribute)對象在子節點對象下面;值(一般是String)對象在屬性對象下面;
Document
|--根元素【Element】
|--子元素
|--屬性對象【Attribute】
|--值對象
|--子元素對象(Element)
|--值對象
|--子元素對象
9、XML文檔讀取步驟
準備工作:引入第三方工具包Dom4j.jar
- 創建SAXReader對象
- 對象對去XML文檔,生成DOM樹
- 獲取根元素
- 獲取到根元素后,利用它獲得其他的子元素還有它自己在的屬性(Attribute)
常用的方法:
1.public String getName():獲取當前Element對象的”標簽名”;
2.public List elements():獲取當前Element對象下的所有子元素;
3.public List elements(String eleName):獲取當前Element對象下的所有 eleName的子元素;
4.public String getText():獲取當前Element對象的數據內容;
5.public String elementText(String eleName):獲取當前Element對象的”eleName子元素的數據內容”;
代碼練習
demo.xml
<?xml version="1.0" encoding="UTF-8"?>
<students>
<student id = "it001">
<name>章子怡</name>
<age>18</age>
<sex>女</sex>
</student>
<student id = "it002">
<name>汪峰</name>
<age>19</age>
<sex>男</sex>
</student>
<student id = "it003">
<name>撒貝寧</name>
<age>20</age>
<sex>男</sex>
</student>
<teacher id="001" name="teacher">
<name>春春</name>
<age>56</age>
<sex>女</sex>
</teacher>
<teacher>
</teacher>
</students>
MyVisitor.java
import org.dom4j.Attribute;
import org.dom4j.Element;
import org.dom4j.VisitorSupport;
public class MyVisitor extends VisitorSupport {
//獲取標簽的對象的名字
@Override
public void visit(Element e) {
System.out.println(e.getName());
}
//獲取標簽屬性的名字
@Override
public void visit(Attribute a) {
System.out.println(a.getName());
}
}
測試類 demo01.java
import java.io.File;
import java.util.Iterator;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
/**
* 解析demo.xml文檔
*
* @author YandeHu
*
*/
public class Demo01 {
private static final String Element = null;
public static void main(String[] args) throws Exception {
// 創建SAXreader對象
SAXReader reader = new SAXReader();
// 讀取demo.xml文檔 返回一個文檔對象
Document dom = reader.read(new File("demo.xml"));
// 讀取XML文檔的根節點
Element root = dom.getRootElement();
// 獲得根節點的名稱
String rootName = root.getName();
System.out.println(rootName);
// 利用根節點獲得下面的子節點
/**
* 遍歷子節點的兩種方式
*/
// 迭代器遍歷子節點
Iterator elr = root.elementIterator();// 遍歷所有的子節點還可以遍歷
while (elr.hasNext()) {
Element e = (Element) elr.next();
String id = e.attributeValue("id");// 獲取標簽的屬性值
System.out.println("id=" + id);
String age = e.elementText("age");// 獲取標簽<age>里的內容
System.out.println("age=" + age);
System.out.println(e.getName());// 獲取節點的名字
// System.out.println(e.getStringValue());//獲取標簽標記的數據
System.out.println(e.getText());
}
/**
* Visitor 是 GOF 設計模式之一。其主要原理就 是兩種類互相保有對方的引用,并且一種作為 Visitor 去訪問許多
* Visitable。
*/
System.out.println("=========Visitor==============");
root.accept(new MyVisitor());
}
}
10、XML約束
- DTD:對一些簡單的XML文件進行約束
- Schema:對一些比較復雜的XML文檔進行更加細致、廣泛的約束。
XML約束可以約束:
- 根元素下都可以出現哪些子元素
- 元素出現的順序、次數
- 元素包含的屬性
- 元素中包含哪些子元素或者數據
- 等
DTD約束條件的引入
- 內部引入
引入外部(本地)
引入外部(網絡)
Schema約束條件的引入
schema文檔結構說明
練習:讀取XML文件獲取類的信息,利用反射創建對象
代碼
student.xml
<?xml version="1.0" encoding="UTF-8"?>
<classes>
<class className="com.day16.text.Student">
<name>張三</name>
<age>18</age>
</class>
</classes>
Student類
public class Student {
private String name;
private int age;
public Student() {
super();
}
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + "]";
}
}
RefiectDemo類 測試類
import java.io.File;
import java.lang.reflect.Constructor;
import java.util.Iterator;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class ReflectDemo {
public static void main(String[] args) throws Exception {
//編寫方法 獲取XML文檔classname內容的方法
String s=getDom(new File("student.xml"));
//利用反射創建實例
Class<?> c = Class.forName(s);
//獲取類的構造方法
Constructor<?> con = c.getConstructor(String.class,int.class);
Object stu = con.newInstance("小明",23);
System.out.println(stu);
}
public static String getDom(File file) throws Exception{
//創建SAXreader對象
SAXReader reader=new SAXReader();
//讀取XML文檔
Document dom = reader.read(file);
//獲取根節點
Element root = dom.getRootElement();
String value=null;
//遍歷根節點
Iterator list = root.elementIterator();
while(list.hasNext()){
Element element = (Element) list.next();
//獲取<class>標簽的屬性值
Attribute classname= element.attribute("className");
value= classname.getValue();
}
return value;
}
}
2017/11/1 17:32:39
智能推薦
SAX解析和xml約束
一、SAX解析 1.特點 SAX解析:讀一點,取一點,節省內存空間。一旦遇到開始標簽觸發之后,及時從內存中將開始節點從內存中釋放點。 2.三要素 3.DOM解析和SAX解析的區別 原理:前者,讀一點,取一點,節省內存空間。一旦遇到開始標簽觸發之后,及時從內存中將開始節點從內存中釋放點。 后者,一次性加載整個xml文件,如果xml...
XML-DTD約束
XML-DTD約束 什么是框架 就是由多種設計模式配合形成的特定的框架處理特定問題底層是通過Java的反射機制來完成 了解xml XML 指可擴展標記語言(EXtensible Markup Language)。 XML 的設計宗旨是傳輸數據,而不是顯示數據。 XML 標簽沒有被預定義。您需要自行定義標簽。 XML 被設計為具有自我描述性。 XML 是 W3C 的推薦標準。 Html與xml區別?...
401、XML的約束
xml 約束 因為xml里面都是自定義標簽,為了讓瀏覽器能夠解析,需要定義規則。 一、定義:規定xml文檔的書寫規則 二、對框架使用則(程序員)的要求 1、能夠在xml中引入約束文檔。 2、能夠簡單的獨棟約束文檔 三、約束文檔的分類 1、DTD:一種簡單的...
Xml的schema約束
schema開發過程 1. schema約束 dtd語法: <!ELEMENT 元素名稱 約束> ** schema符合xml的語法,xml語句 ** 一個xml中可以有多個schema,多個schema使用名稱空間區分(類似于java包名) ** dtd里面有PCDATA類型,但是在schema里面可以支持更多的數據類型 * 比如 年齡 只能是整數,在schema可以直接定義一個整數...
猜你喜歡
xml之dtd約束
xml之dtd約束 xml約束的技術:主要有dtd約束和schema約束(面試題) 本次為dtd約束. dtd快速入門 dtd文件后綴為 dtd 看xml有多少個元素(標簽),有幾個元素(標簽),就寫幾個<!ELEMENT>(大寫) 看是復雜元素還是簡單元素, 復雜元素:擁有子元素 * 格式:<!ELEMENT 元素名稱 (子元素)> * 注意:中間必須要用空格 簡單元素:...
freemarker + ItextRender 根據模板生成PDF文件
1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...
電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!
Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...
requests實現全自動PPT模板
http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...