XML的全称为(EXtensible Markup Language),是一种可扩展的标记语言。
创建
文档声明
文档声明必须是第一行第一列
标签规则
标签由一对尖括号和合法标识符组成
<student>
标签必须成对出现
<student> </student>
前边的是开始标签,后边的是结束标签
特殊的标签可以不成对, 但是必须有结束标记
<address/>
标签中可以定义属性,属性和标签名空格隔开,属性值必须用引号引起来
<student id="1"> </student>
标签需要正确的嵌套
这是正确的:
<student id="1">
<name>张三</name>
</student>
这是错误的:
<student id="1">
<name>张三
</student>
</name>
北京市 :
东城区
西城区
朝阳区
海淀区
昌平区
这东西以后都不会自己写
编写DTD约束
步骤
创建一个文件,这个文件的后缀名为.dtd
看xml文件中使用了哪些元素
可以定义元素判断元素是简单元素还是复杂元素
简单元素:没有子元素。
复杂元素:有子元素的元素;
代码实现
<!ELEMENT persons (person)>
<!ELEMENT person (name,age)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
引入DTD约束
引入本地dtd
在xml文件内部引入
引入网络dtd
引入本地DTD约束
// 这是persondtd.dtd文件中的内容,已经提前写好
<!ELEMENT persons (person)>
<!ELEMENT person (name,age)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
// 在person1.xml文件中引入persondtd.dtd约束
DOCTYPE persons SYSTEM 'persondtd.dtd'>
<persons>
<person>
<name>张三name>
<age>23age>
person>
persons>
在xml文件内部引入
DOCTYPE persons [
<!ELEMENT persons (person)>
<!ELEMENT person (name,age)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
]>
<persons>
<person>
<name>张三name>
<age>23age>
person>
persons>
引入网络dtd
DOCTYPE persons PUBLIC "dtd文件的名称" "dtd文档的URL">
<persons>
<person>
<name>张三name>
<age>23age>
person>
persons>
schema 和 dtd 的区别
编写schema约束
1. 创建一个文件,这个文件的后缀名为.xsd
2. 定义文档声明
3. schema文件的根标签为: <schema>
4. 在<schema>中定义属性:
xmlns=http://www.w3.org/2001/XMLSchema
5. 在<schema>中定义属性:
targetNamespace = 唯一的url地址,指定当前这个schema文件的名称空间
理解: 起个名, 顺带打广告
6. 在<schema>中定义属性:
elementFormDefault="qualified“,表示当前schema文件是一个质量良好的文件
7. 通过element定义元素
8. 判断当前元素是简单元素还是复杂元素
<stus xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.mhys.com"
xsi:schemaLocation="http://www.mhys.com stus.xsd"
>
<student>
<name>张三</name>
<age>23</age>
</student>
</stus>
SAXReader reader = new SAXReader();
Document document = reader.read(new File("day15-code\\src\\xml\\stus.xml"));
System.out.println(document);
package com.ligong.start;
import com.ligong.domain.Student;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.List;
public class Test {
public static void main(String[] args) throws DocumentException, FileNotFoundException {
SAXReader reader = new SAXReader();
Document document = reader.read(new File("mC\\src\\xml\\stus.xml"));
ArrayList<Student> list = new ArrayList<>();
// 1. 获取根标签
Element rootElement = document.getRootElement();
// 2. 获取根标签下的所有子标签
List<Element> student = rootElement.elements("student");
// 3. 遍历集合
for (Element element : student) {
// 4. 获取标签属性
String id = element.attributeValue("id");
// 5. 获取name标签的值
String name = element.element("name").getText();
// 6. 获取age标签的值
String age = element.element("age").getText();
// 7. 封装为Student学生对象
Student stu = new Student(name, Integer.parseInt(age));
// 8. 添加到集合
list.add(stu);
}
list.forEach(s -> System.out.println(s));
}
}
SAXReader reader = new SAXReader();
Document document = reader.read(new File("mC\\src\\xml\\stus.xml"));
package com.ligong.start;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.List;
public class Test {
public static void main(String[] args) throws DocumentException, FileNotFoundException {
SAXReader reader = new SAXReader();
Document document = reader.read(new File("mC\\src\\xml\\stus.xml"));
// 获取单个节点
Node node = document.selectSingleNode("/students");
System.out.println(node.getText());
// 获取多个节点
List<Element> list = document.selectNodes("/students/student/name");
for (Element element : list) {
System.out.println(element.getText());
}
}
}
package com.ligong.start;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.List;
public class A {
public static void main(String[] args) throws DocumentException, FileNotFoundException {
SAXReader reader = new SAXReader();
Document document = reader.read(new File("mC\\src\\xml\\stus.xml"));
// 相对路径: 相对于根节点
Element rootElement = document.getRootElement();
// 获取单个
Node node = rootElement.selectSingleNode("./student/name");
System.out.println(node.getText());
// 获取多个节点
List<Element> list = rootElement.selectNodes("./student/age");
for (Element element : list) {
System.out.println(element.getText());
}
}
}
package com.ligong.start;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.List;
public class A {
public static void main(String[] args) throws DocumentException, FileNotFoundException {
SAXReader reader = new SAXReader();
Document document = reader.read(new File("mC\\src\\xml\\stus.xml"));
// 获取多个节点 - 全文检索
List<Element> list1 = document.selectNodes("//name");
for (Element element : list1) {
System.out.println(element.getText());
}
System.out.println("---------------------------");
// 获取多个节点 - 全文检索 / (父节点下面的子节点)
List<Element> list2 = document.selectNodes("//student/name");
for (Element element : list2) {
System.out.println(element.getText());
}
System.out.println("---------------------------");
// 获取多个节点 - 全文检索 / (父节点下面的子节点, 孙子节点, 重孙子...)
List<Element> list3 = document.selectNodes("//student//name");
for (Element element : list3) {
System.out.println(element.getText());
}
}
}
package com.ligong.start;
import org.dom4j.*;
import org.dom4j.io.SAXReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.List;
public class A {
public static void main(String[] args) throws DocumentException, FileNotFoundException {
SAXReader reader = new SAXReader();
Document document = reader.read(new File("mC\\src\\xml\\stus.xml"));
// 全文检索 : 所有属性
List<Attribute> list1 = document.selectNodes("//@id");
for (Attribute attribute : list1) {
System.out.println(attribute.getText());
}
System.out.println("---------------------------");
// 全文检索 : 带有指定属性的子标签
List<Element> list2 = document.selectNodes("//student[@id]");
for (Element element : list2) {
System.out.println(element.getName());
}
System.out.println("---------------------------");
// 全文检索 : 带有指定属性的子标签 + 标签值
List<Element> list3 = document.selectNodes("//student[@id=2]");
for (Element element : list3) {
System.out.println(element.element("name").getText());
}
}
}
dom4j-1.6.1.jar
jaxen-1.1-beta-6.jar
SAXReader reader = new SAXReader();
Document document = reader.read(new File("xxxx"));
document.selectSingleNode("路径");
document.selectNodes("路径");
绝对路径 : 逐级查找
相对路径 : 相对于根节点 rootElement (了解)
./student/name
注意: 必须使用根标签对象, 调用方法.
//name : 文件里所有的都找出来, 不考虑子父标签
//student/name : 找指定父节点下面的子标签
//student//name : 找父节点下面所有后辈的子标签
//@id : 文件里所有的都找出来, 不考虑子父标签
- 注意: 这东西玩的是属性, Attribute
//student[@id] : 找带有id属性的student标签
- 注意: 找到的是标签, Element
//student[@id='2'] : 跟上面一样, 找的是标签, 就是带有具体属性值
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-M5xxaXYe-1643258138017)(img\18.png)]
public class ComputerFactory {
/**
定义一个方法,创建对象返回
*/
public static Computer createComputer(String info){
switch (info){
case "huawei":
Computer c = new Huawei();
c.setName("huawei pro 16");
c.setPrice(5999);
return c;
case "mac":
Computer c2 = new Mac();
c2.setName("MacBook pro");
c2.setPrice(11999);
return c2;
default:
return null;
}
}
}