xml概念語法解析
標簽: 學習筆記
XML
1. 概念
2. 語法
3. 解析
XML:
1. 概念:Extensible Markup Language 可擴展標記語言
* 可擴展:標簽都是自定義的。 <user> <student>
* 功能
* 存儲數據
1. 配置文件
2. 在網絡中傳輸
* xml與html的區別
1. xml標簽都是自定義的,html標簽是預定義。
2. xml的語法嚴格,html語法松散
3. xml是存儲數據的,html是展示數據
* w3c:萬維網聯盟
2. 語法:
* 基本語法:
1. xml文檔的后綴名 .xml
2. xml第一行必須定義為文檔聲明
3. xml文檔中有且僅有一個根標簽
4. 屬性值必須使用引號(單雙都可)引起來
5. 標簽必須正確關閉
6. xml標簽名稱區分大小寫
* 快速入門:
<?xml version='1.0' ?>
<users>
<user id='1'>
<name>zhangsan</name>
<age>23</age>
<gender>male</gender>
<br/>
</user>
<user id='2'>
<name>lisi</name>
<age>24</age>
<gender>female</gender>
</user>
</users>
```
組成部分
1. 文檔聲明
1. 格式:<?xml 屬性列表 ?>
2. 屬性列表:
* version:版本號,必須的屬性
* encoding:編碼方式。告知解析引擎當前文檔使用的字符集,默認值:ISO-8859-1
* standalone:是否獨立
* 取值:
* yes:不依賴其他文件
* no:依賴其他文件
2. 指令(了解):結合css的
* <?xml-stylesheet type="text/css" href="a.css" ?>
3. 標簽:標簽名稱自定義的
* 規則:
* 名稱可以包含字母、數字以及其他的字符
* 名稱不能以數字或者標點符號開始
* 名稱不能以字母 xml(或者 XML、Xml 等等)開始
* 名稱不能包含空格
4. 屬性:
id屬性值唯一
5. 文本:
* CDATA區:在該區域中的數據會被原樣展示
* 格式: <![CDATA[ 數據 ]]>
?
* 約束:規定xml文檔的書寫規則
* 作為框架的使用者(程序員):
1. 能夠在xml中引入約束文檔
2. 能夠簡單的讀懂約束文檔
* 分類:
1. DTD:一種簡單的約束技術
2. Schema:一種復雜的約束技術
* DTD:
* 引入dtd文檔到xml文檔中
* 內部dtd:將約束規則定義在xml文檔中
代碼如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!--<!DOCTYPE students SYSTEM "student.dtd">-->
<!DOCTYPE students [
<!ELEMENT students (student)+>
<!ELEMENT student (name,age,sex)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT sex (#PCDATA)>
<!ATTLIST student number ID #REQUIRED>
]>
<students>
<student number="s001">
<name>zhangsan</name>
<age>23</age>
<sex>male</sex>
</student>
<student number="s002">
<name>lisi</name>
<age>24</age>
<sex>female</sex>
</student>
</students>
- 外部dtd:將約束的規則定義在外部的dtd文件中
- 本地:
- 網絡:
代碼如下:
<!ELEMENT students (student)+>
<!ELEMENT student (name,age,sex)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT sex (#PCDATA)>
<!ATTLIST student number ID #REQUIRED>
* Schema:
* 引入:
1.填寫xml文檔的根元素
2.引入xsi前綴. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3.引入xsd文件命名空間. xsi:schemaLocation="http://www.itcast.cn/xml student.xsd"
4.為每一個xsd約束聲明一個前綴,作為標識 xmlns="http://www.itcast.cn/xml"
<students xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.itcast.cn/xml"
xsi:schemaLocation="http://www.itcast.cn/xml student.xsd">
外部約束:
<?xml version="1.0"?>
<xsd:schema xmlns="http://www.itcast.cn/xml"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.itcast.cn/xml" elementFormDefault="qualified">
<xsd:element name="students" type="studentsType"/>
<xsd:complexType name="studentsType">
<xsd:sequence>
<xsd:element name="student" type="studentType" minOccurs="0" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="studentType">
<xsd:sequence>
<xsd:element name="name" type="xsd:string"/>
<xsd:element name="age" type="ageType" />
<xsd:element name="sex" type="sexType" />
</xsd:sequence>
<xsd:attribute name="number" type="numberType" use="required"/>
</xsd:complexType>
<xsd:simpleType name="sexType">
<xsd:restriction base="xsd:string">
<xsd:enumeration value="male"/>
<xsd:enumeration value="female"/>
</xsd:restriction>
</xsd:simpleType>
<xsd:simpleType name="ageType">
<xsd:restriction base="xsd:integer">
<xsd:minInclusive value="0"/>
<xsd:maxInclusive value="256"/>
</xsd:restriction>
</xsd:simpleType>
<xsd:simpleType name="numberType">
<xsd:restriction base="xsd:string">
<xsd:pattern value="heima_\d{4}"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:schema>
代碼如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!--
1.填寫xml文檔的根元素
2.引入xsi前綴. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3.引入xsd文件命名空間. xsi:schemaLocation="http://www.itcast.cn/xml student.xsd"
4.為每一個xsd約束聲明一個前綴,作為標識 xmlns="http://www.itcast.cn/xml"
-->
<a:students xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.itcast.cn/xml student.xsd
http://cxf.apache.org/bindings/soap
"
xmlns:a="http://www.itcast.cn/xml"
xmlns:b="http://cxf.apache.org/bindings/soap"
>
<a:student number="heima_0001">
<a:name>zhangsan</a:name>
<a:age>55</a:age>
<a:sex>male</a:sex>
</a:student>
</a:students>
?
-
解析:操作xml文檔,將文檔中的數據讀取到內存中
* 操作xml文檔
1. 解析(讀取):將文檔中的數據讀取到內存中
2. 寫入:將內存中的數據保存到xml文檔中。持久化的存儲* 解析xml的方式: 1. DOM:將標記語言文檔一次性加載進內存,在內存中形成一顆dom樹 * 優點:操作方便,可以對文檔進行CRUD的所有操作 * 缺點:占內存 2. SAX:逐行讀取,基于事件驅動的。 * 優點:不占內存。 * 缺點:只能讀取,不能增刪改 * xml常見的解析器: 1. JAXP:sun公司提供的解析器,支持dom和sax兩種思想 2. DOM4J:一款非常優秀的解析器 3. Jsoup:jsoup 是一款Java 的HTML解析器,可直接解析某個URL地址、HTML文本內容。它提供了一套非常省力的API,可通過DOM,CSS以及類似于jQuery的操作方法來取出和操作數據。 4. PULL:Android操作系統內置的解析器,sax方式的。 * Jsoup:jsoup 是一款Java 的HTML解析器,可直接解析某個URL地址、HTML文本內容。它提供了一套非常省力的API,可通過DOM,CSS以及類似于jQuery的操作方法來取出和操作數據。 Jsoup的主要功能 1)從一個URL,文件或字符串中解析HTML 2)使用DOM或CSS選擇器來查找、取出數據 3)可操作HTML元素、屬性、文本 注意:jsoup是基于MIT協議發布的,可放心使用于商業項目。 * 快速入門: * 步驟: 1. 導入jar包 2. 獲取Document對象 3. 獲取對應的標簽Element對象 4. 獲取數據
- 代碼:
package jsoup;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.File;
import java.io.IOException;
public class Demo01_jsoup {
public static void main(String[] args) throws IOException {
// 1.導包
// 2.獲取document對象,根據xml文檔實現
//2.1獲取student.xml的path
//xxx.class.getClassLoader().getResource(“”).getPath();
//獲取src資源文件編譯后的路徑(即classes路徑)
//xxx.class.getClassLoader().getResource(“文件”).getPath();
//獲取classes路徑下“文件”的路徑
String path = Demo01_jsoup.class.getClassLoader().getResource("jsoup/student.xml").getPath();
//2.2解析xml文檔,加載文檔進內存,獲取dom樹
Document document = Jsoup.parse(new File(path), "utf-8");
// 3.獲取元素對象Element
Elements elements = document.getElementsByTag("name");
System.out.println(elements.size());
//3.1獲取第一個name的Element對象
Element element = elements.get(0);
// //3.2獲取數據
// 對于一個元素中的文本,可以使用Element.text()方法
String name = element.text();
System.out.println(name);
}
}
* 對象的使用:
1. Jsoup:工具類,可以解析html或xml文檔,返回Document
* parse:解析html或xml文檔,返回Document
* parse?(File in, String charsetName):解析xml或html文件的。
* parse?(String html):解析xml或html字符串
* parse?(URL url, int timeoutMillis):通過網絡路徑獲取指定的html或xml的文檔對象
代碼如下:
package xml解析;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.File;
import java.io.IOException;
import java.net.URL;
public class jsoup_jsoup對象 {
public static void main(String[] args) throws IOException {
//2.1獲取student.xml的path
//xxx.class.getClassLoader().getResource(“”).getPath();
//獲取src資源文件編譯后的路徑(即classes路徑)
//xxx.class.getClassLoader().getResource(“文件”).getPath();
//獲取classes路徑下“文件”的路徑
/*
* parse:解析html或xml文檔,返回Document
* parse(File in, String charsetName):解析xml或html文件的。
* parse(String html):解析xml或html字符串
* parse(URL url, int timeoutMillis):通過網絡路徑獲取指定的html或xml的文檔對象
*
*
* */
String path = jsoup.Demo01_jsoup.class.getClassLoader().getResource("jsoup/student.xml").getPath();
//2.2解析xml文檔,加載文檔進內存,獲取dom樹
//第一種方法
// parse(File in, String charsetName):解析xml或html文件的。
Document document = Jsoup.parse(new File(path), "utf-8");
//System.out.println(document);
//第二種方法
// parse(String html):解析xml或html字符串
String str = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n" +
"\n" +
"<students>\n" +
"\n" +
" <student number=\"heima_0001\">\n" +
" <name>zhangsan</name>\n" +
" <age>55</age>\n" +
" <sex>male</sex>\n" +
" </student>\n" +
" <student number=\"heima_0002\">\n" +
" <name>lisi</name>\n" +
" <age>55</age>\n" +
" <sex>male</sex>\n" +
" </student>\n" +
"\n" +
"</students>";
Document document1 = Jsoup.parse(str);
//System.out.println(document1);
//第三種方法
// parse(URL url, int timeoutMillis):通過網絡路徑獲取指定的html或xml的文檔對象
// int timeoutMillis 多少秒無響應則返回
URL url = new URL("https://www.baidu.com");
Document document2 = Jsoup.parse(url, 10000);
System.out.println(document2);
}
}
- Document:文檔對象。代表內存中的dom樹
- 獲取Element對象
- getElementById?(String id):根據id屬性值獲取
唯一的element對象
* getElementsByTag?(String tagName):根據標簽名稱獲取元素對象集合
* getElementsByAttribute?(String key):根據屬性名稱獲取元素對象集合
* getElementsByAttributeValue?(String key, String value):根據對應的屬性名和屬性值獲取元素對象集合
代碼如下:
package xml解析;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.File;
import java.io.IOException;
public class jsoup_document對象 {
public static void main(String[] args) throws IOException {
/*
* 2. Document:文檔對象。代表內存中的dom樹
* 獲取Element對象
* getElementById(String id):根據id屬性值獲取唯一的element對象
* getElementsByTag(String tagName):根據標簽名稱獲取元素對象集合
* getElementsByAttribute(String key):根據屬性名稱獲取元素對象集合
* getElementsByAttributeValue(String key, String value):根據對應的屬性名和屬性值獲取元素對象集合
* */
String path = jsoup.Demo01_jsoup.class.getClassLoader().getResource(“jsoup/student.xml”).getPath();
//2.2解析xml文檔,加載文檔進內存,獲取dom樹
// parse(File in, String charsetName):解析xml或html文件的。
Document document = Jsoup.parse(new File(path), “utf-8”);
// * getElementsByTag(String tagName):根據標簽名稱獲取元素對象集合
Elements elementsByTag = document.getElementsByTag(“student”);
System.out.println(elementsByTag);
System.out.println("-------------");
// getElementsByAttribute(String key):根據屬性名稱獲取元素對象集合
Elements name = document.getElementsByAttribute(“id”);
System.out.println(name);
System.out.println("--------------");
// getElementById(String id):根據id屬性值獲取唯一的element對象
Element elementById = document.getElementById(“001”);
System.out.println(elementById);
System.out.println("--------------");
// getElementsByAttributeValue(String key, String value):根據對應的屬性名和屬性值獲取元素對象集合
Elements id = document.getElementsByAttributeValue(“id”, “001”);
System.out.println(id);
}
}
-
Elements:元素Element對象的集合。可以當做 ArrayList來使用
4. Element:元素對象
1. 獲取子元素對象
* getElementById?(String id):根據id屬性值獲取唯一的element對象
* getElementsByTag?(String tagName):根據標簽名稱獲取元素對象集合
* getElementsByAttribute?(String key):根據屬性名稱獲取元素對象集合
* getElementsByAttributeValue?(String key, String value):根據對應的屬性名和屬性值獲取元素對象集合- 獲取屬性值
* String attr(String key):根據屬性名稱獲取屬性值 - 獲取文本內容
* String text():獲取文本內容
* String html():獲取標簽體的所有內容(包括字標簽的字符串內容)
代碼如下:
- 獲取屬性值
package xml解析;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.File;
import java.io.IOException;
public class jsoup_element {
public static void main(String[] args) throws IOException {
/*
* 3. Elements:元素Element對象的集合。可以當做 ArrayList<Element>來使用
4. Element:元素對象
1. 獲取子元素對象
* getElementById(String id):根據id屬性值獲取唯一的element對象
* getElementsByTag(String tagName):根據標簽名稱獲取元素對象集合
* getElementsByAttribute(String key):根據屬性名稱獲取元素對象集合
* getElementsByAttributeValue(String key, String value):根據對應的屬性名和屬性值獲取元素對象集合
2. 獲取屬性值
* String attr(String key):根據屬性名稱獲取屬性值
3. 獲取文本內容
* String text():獲取文本內容
* String html():獲取標簽體的所有內容(包括字標簽的字符串內容)
* */
String path = jsoup.Demo01_jsoup.class.getClassLoader().getResource("jsoup/student.xml").getPath();
//2.2解析xml文檔,加載文檔進內存,獲取dom樹
// parse(File in, String charsetName):解析xml或html文件的。
Document document = Jsoup.parse(new File(path), "utf-8");
Elements name = document.getElementsByTag("name");
System.out.println(name.size());
System.out.println("-------");
Element ele_student = document.getElementsByTag("student").get(0);
Elements ele_name = ele_student.getElementsByTag("name");
System.out.println(ele_name.size());
System.out.println("-----------");
String number = ele_student.attr("number");
System.out.println(number);
System.out.println("-------");
String text = ele_name.text();
String html = ele_name.html();
System.out.println(text);
System.out.println(html);
}
}
?
5. Node:節點對象
* 是Document和Element的父類
* 快捷查詢方式:
1. selector:選擇器
* 使用的方法:Elements select?(String cssQuery)
* 語法:參考Selector類中定義的語法
* 代碼:
package jsoup;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;
import java.io.File;
import java.io.IOException;
public class jsoup_selector快速查詢 {
public static void main(String[] args) throws IOException {
/**
*1. selector:選擇器
* * 使用的方法:Elements select(String cssQuery)
* * 語法:參考Selector類中定義的語法
* */
String path = jsoup.Demo01_jsoup.class.getClassLoader().getResource("jsoup/student.xml").getPath();
//2.2解析xml文檔,加載文檔進內存,獲取dom樹
// parse(File in, String charsetName):解析xml或html文件的。
Document document = Jsoup.parse(new File(path), "utf-8");
//3.查name標簽
Elements elements = document.select("name");
System.out.println(elements);
System.out.println("=========");
//4.查詢id為001的元素
Elements element1 = document.select("#001");
System.out.println(element1);
//5.獲取student標簽并且number屬性值為heima_0001的aged的子標簽
//5.1獲取student標簽并且number屬性值為heima_0001
Elements number = document.select("student[number=\"heima_0001\"]");
System.out.println(number);
System.out.println("=============");
//5.2 獲取student標簽并且number屬性值為heima_0001的aged的子標簽
Elements age = document.select("student[number=\"heima_0001\"] >age");
System.out.println(age);
}
}
- XPath:XPath即為XML路徑語言,它是一種用來確定XML(標準通用標記語言的子集)文檔中某部分位置的語言
* 使用Jsoup的Xpath需要額外導入jar包。
* 查詢w3cshool參考手冊,使用xpath的語法完成查詢
代碼如下:
package jsoup;
import cn.wanghaomiao.xpath.exception.XpathSyntaxErrorException;
import cn.wanghaomiao.xpath.model.JXDocument;
import cn.wanghaomiao.xpath.model.JXNode;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import java.io.File;
import java.io.IOException;
import java.util.List;
public class jsoup_Xpath {
public static void main(String[] args) throws IOException, XpathSyntaxErrorException {
// XPath:XPath即為XML路徑語言,它是一種用來確定XML(標準通用標記語言的子集)文檔中某部分位置的語言
// * 使用Jsoup的Xpath需要額外導入jar包。
// * 查詢w3cshool參考手冊,使用xpath的語法完成查詢
//1.獲取student.xml的path
String path = jsoup_Xpath.class.getClassLoader().getResource("jsoup/student.xml").getPath();
//2.獲取Document對象
Document document = Jsoup.parse(new File(path), "utf-8");
//3.根據document對象,創建JXDocument對象
JXDocument jxDocument = new JXDocument(document);
//4.結合xpath語法查詢
//4.1查詢所有student標簽
List<JXNode> jxNodes = jxDocument.selN("//student");
for (JXNode jxNode : jxNodes) {
System.out.println(jxNode);
}
System.out.println("--------------------");
//4.2查詢所有student標簽下的name標簽
List<JXNode> jxNodes2 = jxDocument.selN("//student/name");
for (JXNode jxNode : jxNodes2) {
System.out.println(jxNode);
}
System.out.println("--------------------");
//4.3查詢student標簽下帶有id屬性的name標簽
List<JXNode> jxNodes3 = jxDocument.selN("//student/name[@id]");
for (JXNode jxNode : jxNodes3) {
System.out.println(jxNode);
}
System.out.println("--------------------");
//4.4查詢student標簽下帶有id屬性的name標簽 并且id屬性值為itcast
List<JXNode> jxNodes4 = jxDocument.selN("//student/name[@id='itcast']");
for (JXNode jxNode : jxNodes4) {
System.out.println(jxNode);
}
}
ystem.out.println("--------------------");
//4.3查詢student標簽下帶有id屬性的name標簽
List<JXNode> jxNodes3 = jxDocument.selN("//student/name[@id]");
for (JXNode jxNode : jxNodes3) {
System.out.println(jxNode);
}
System.out.println("--------------------");
//4.4查詢student標簽下帶有id屬性的name標簽 并且id屬性值為itcast
List<JXNode> jxNodes4 = jxDocument.selN("//student/name[@id='itcast']");
for (JXNode jxNode : jxNodes4) {
System.out.println(jxNode);
}
}
}
智能推薦
XML解析
1. Java中配置文件的三種配置位置及讀取方式 1.1.讀取同級目錄下的配置文件 1.2.讀取項目根路徑下的配置文件 輸出 1.3.WEB-INF(或其子目錄下)寫一個servlet 輸出 3. dom4j+xpath解析xml文件 進行dom4j解析XML文件的時候需要導入以下包 案例 輸出...
XML解析
一、dom方法 文檔對象模型,方法擅長小規模的讀和寫 處理方式是將整個的xml作為一個樹結構的方法是讀入內存來操作和解析,解析大量數據文件時會遇到內存泄漏及程序崩潰的風險。 dom寫方法: 1.先通過此方法創建一個document節點 2.通過創建節點 Element docx = document.createElement("document");、創建屬性do...
XML解析
什么是xml文件?筆者認為語言描述往往是晦澀的,有時候非但不能達到某種效果,反而令人生畏。不如我們先直接給出一個xml文件。 xml文件有兩種書寫方式(用標簽和用屬性),這里我們推薦用屬性。 對xml文件的解析可以實現對xml文件的增刪改查,這篇博文只實現了對xml的”查“功能。 為了輸出的美觀,給出一個StudentInfo類 再給出真正用來解析xml文件的類 執行結果 ...
XML解析
XML文件解析 首先我以“學生信息”舉例,給一個xml文件的代碼: student.tag.xml 再給另一個xml文件: student.att.xml 前一種著重使用標簽,第二種方式綜合屬性和標簽。這兩種都可以表達學生信息,沒有哪種是標準方式。 分別給出兩個xml文件的解析類: TestParseTag.java TestParseAttribute.java 觀察上面...
Xml解析
Android基礎——XML數據的三種解析方式 本篇文章包含以下內容: XML數據的Dom解析 XML數據的Sax解析 XML數據的Pull解析 Activity中使用三種解析 Sax解析與Pull解析區別 三種解析方式的步驟: 在Assets文件夾中模擬創建XML數據 創建對應XML的Bean對象 開始解析 XML數據的Dom解析 DOM解析XML文件時,會將XML文件的...
猜你喜歡
xml解析
JAXB 1.@XmlRootElement,用于類級別的注解,對應xml的跟元素。通過name屬性定義這個根節點的名稱。 2.@XmlAccessorType,定義映射這個類中的何種類型都需要映射到xml。(如果不存在@XmlAccessorType,默認使用XmlAccessType.PUBLIC_MEMBER注解) 參數:XmlAccessType.FIELD: java對象中的所有成員...
freemarker + ItextRender 根據模板生成PDF文件
1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...
電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!
Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...