xml;extensible markup language 可扩展标记语言
idea添加xml模板
1.Ctrl + Alt+S
2 .找到File and Code Templates
3.
xml基本语法
1. xml文档的后缀名 .xml
2. xml第一行必须定义为文档声明
3. xml文档中有且仅有一个根标签
4. 属性值必须使用引号(单双都可)引起来
5. 标签必须正确关闭
6. xml标签名称区分大小写
xml基本代码
<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/css" href="a.css" ?>//引入css,了解
<students>
<student number="s001">
<name>zhangsan</name>
<age>abc</age>
<sex>hehe</sex>
</student>
<student number="s002">
<name>lisi</name>
<age>24</age>
<code>
<![CDATA[//CDATA区域的文本原样输出<![CDATA[ ]]>
if(a < b && a > c) {}
]]]>
</code>
<sex>female</sex>
</student>
</students>
约束的分类
在XML技术里,可以编写一个文档来约束一个XML文档的书写规范(与xml语法无关),这称之为XML约束。
1.DTD简单的约束技术
2.schema:复杂的约束技术
DTD
student.dtd
<!ELEMENT students (student*) > //可以放多个student子标签
<!ELEMENT student (name,age,sex)>//各按顺序出现一次
<!ELEMENT name (#PCDATA)>//pcadata字符串
<!ELEMENT age (#PCDATA)>
<!ELEMENT sex (#PCDATA)>
<!ATTLIST student number ID #REQUIRED>//必须出现,属性
student.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE students SYSTEM "student.dtd">
//外部引用 :<!DOCTYPE 根标签名 SYSTEM "dtd文件的位置">
//网络引用:<!DOCTYPE 根标签名 PUBLIC "dtd文件名字" "dtd文件的位置URL">
//内部引用:
<!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>abc</age>
<sex>hehe</sex>
</student>
<student number="s002">
<name>lisi</name>
<age>24</age>
<sex>female</sex>
</student>
</students>
schema
<?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"
-->
<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"
>
<student number="heima_0001">
<name>tom</name>
<age>18</age>
<sex>male</sex>
</student>
</students>
xml解析器
1. JAXP:sun公司提供的解析器,支持dom和sax两种思想
2. DOM4J:一款非常优秀的解析器
3. Jsoup:jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。
4. PULL:Android操作系统内置的解析器,sax方式的。
jsoup
导入jar包
public class JsoupDemo1 {
public static void main(String[] args) throws IOException {
//2.获取Document对象,根据xml文档获取
//2.1获取student.xml的path
String path = JsoupDemo1.class.getClassLoader().getResource("student.xml").getPath();
//防止中文路径出现乱码
String configPath = java.net.URLDecoder.decode(path,"utf-8");
//2.2解析xml文档,加载文档进内存,获取dom树--->Document
Document document = Jsoup.parse(new File(configPath), "utf-8");
//通过网络路径
/* URL url = new URL("https://baike.baidu.com/item/jsoup/9012509?fr=aladdin");
//代表网络中的一个资源路径
Document document = Jsoup.parse(url, 10000);*/
//3.获取元素对象 Element
Elements elements = document.getElementsByTag("name");
System.out.println(elements.size());
//3.1获取第一个name的Element对象
Element element = elements.get(0);
//3.2获取数据
String name = element.text();
System.out.println(name);
}
}
//3.1获取所有student对象
Elements elements = document.getElementsByTag("student");
//3.2 获取属性名为id的元素对象们
Elements elements1 = document.getElementsByAttribute("id");
//3.2获取 number属性值为heima_0001的元素对象
Elements elements2 = document.getElementsByAttributeValue("number", "heima_0001");
//3.3获取id属性值的元素对象
Element itcast = document.getElementById("itcast");
//通过Element对象获取子标签对象
Element element_student = document.getElementsByTag("student").get(0);
Elements ele_name = element_student.getElementsByTag("name");
System.out.println(ele_name.size());
//获取student对象的属性值
String number = element_student.attr("NUMBER");
//获取文本内容
String text = ele_name.text();
String html = ele_name.html();
System.out.println(text);
System.out.println(html);