- XML
- XML的创建和语法规则
- 文档约束
- DTD
- schema
- XML解析技术
- Dom4J解析XML文件
- XML检索技术:XPath
- 设计模式:工厂模式
- 设计模式:装饰模式
我们在某些业务场景下,存储数据或者传输数据给别人的时候,数据需要满足一定的规范进行组织(XML)。把XML文件中数据提取出来是(XML解析技术)。方便的在XML文件中进行数据的检索用(XPath)。 XML
可扩展标记语言的缩写,它是一种数据表示形式,可以描述复杂的数据结构,常用于传输和存储数据。
(1)标签名可以随便取
(2)允许标签嵌套
(3)纯文本,默认使用UTF-8编码
(4)如果把XML内容存为文件,那它就是一个XML文件,后缀名.xml
(5)XML内容当成消息进行网络传输或者作为配置文件用于存储系统的信息
第一行必为文档声明
(1)标签由一堆尖括号和合法标识符组成,必须只有一个根标签。
(2)标签必须成对出现,有出现,有结束。
(3)特殊的标签可以不重复,但是必须有结束标记。
(4)标签中可以定义属性,属性和标签名空格隔开,属性值必须用引号括起来。
(5)特殊字符:
XML文件中可以存在CDATA区: ,在这里面可以不用写特殊字符的符号。
限定xml文件中的标签和属性应该怎么写,以此强制约束程序员必须按照文档约束的规定编写xml文件。
DTD 步骤:( 1 )在idea中写文件后缀为.dtd
(2)在需要编写的XML文件中导入DTD约束文档。
(3)按照约束的规定编写XML文件的内容。
缺点:不能约束数据类型
①:编写schema约束文档,后缀必须是.xsd. ②:在需要编写的XML文件中导入该schema约束文档. ③:按照约束内容编写XML文件的标签。XML解析技术
XML的数据作用:存储数据,做配置信息,进行数据传输+最终需要被程序进行读取,解析里面的信息。
DOM常见的解析工具:
public class Dom4JHelloWorldDemo1 {
@Test
public void parseXMLData() throws Exception {
// 1、创建一个Dom4j的解析器对象,代表了整个dom4j框架
SAXReader saxReader = new SAXReader();
// 2、把XML文件加载到内存中成为一个Document文档对象
//Document document = saxReader.read(new File("xml-app\src\Contacts.xml")); // 需要通过模块名去定位
// Document document = saxReader.read(new FileInputStream("xml-app\src\Contacts.xml"));
// 注意: 调用class中的getResourceAsStream中的 / .xml
InputStream is = Dom4JHelloWorldDemo1.class.getResourceAsStream("/Contacts.xml");
Document document = saxReader.read(is);
// 3、获取根元素对象
Element root = document.getRootElement();
System.out.println(root.getName());
}
}
Dom4j解析XML的元素、属性、文本的各种API:
Dom4J的解析思想:得到文档对象Document,从中获取元素对象和内容。
XML检索技术:XPath如何从XML文件中检索需要的某个信息(如name)?
(1)Dom4j需要进行文件的全部解析,然后再寻找数据。Dom4J用于解析数据,Xpath用于检索数据。
(2)Xpath技术更加适合做信息检索,使用路径表达式来定位XML文档中的元素节点或者属性节点。
/元素/子元素/孙元素 //子元素//孙元素
(3)使用步骤:
(4)路径查找:
绝对路径:/根元素/子元素/孙元素(从根元素开始,一级一级向下寻找,不能跨级)
相对路径:先得到根节点contactList
再采用相对路径获取下一级contact 节点的name子节点并打印信息
./子元素/孙元素 从当前元素开始,一级一级向下查找,不能跨级
全文搜索
XPath:属性查找
public class XPathDemo {
public void parse01() throws Exception {
// a、创建解析器对象
SAXReader saxReader = new SAXReader();
// b、把XML加载成Document文档对象
Document document =
saxReader.read(XPathDemo.class.getResourceAsStream("/Contacts2.xml"));
// c、检索全部的名称
List nameNodes = document.selectNodes("/contactList/contact/name");
for (Node nameNode : nameNodes) {
Element nameEle = (Element) nameNode;
System.out.println(nameEle.getTextTrim());
}
}
public void parse02() throws Exception {
// a、创建解析器对象
SAXReader saxReader = new SAXReader();
// b、把XML加载成Document文档对象
Document document =
saxReader.read(XPathDemo.class.getResourceAsStream("/Contacts2.xml"));
Element root = document.getRootElement();
// c、检索全部的名称
List nameNodes = root.selectNodes("./contact/name");
for (Node nameNode : nameNodes) {
Element nameEle = (Element) nameNode;
System.out.println(nameEle.getTextTrim());
}
}
public void parse03() throws Exception {
// a、创建解析器对象
SAXReader saxReader = new SAXReader();
// b、把XML加载成Document文档对象
Document document =
saxReader.read(XPathDemo.class.getResourceAsStream("/Contacts2.xml"));
// c、检索数据
//List nameNodes = document.selectNodes("//name");
// List nameNodes = document.selectNodes("//contact/name");
List nameNodes = document.selectNodes("//contact//name");
for (Node nameNode : nameNodes) {
Element nameEle = (Element) nameNode;
System.out.println(nameEle.getTextTrim());
}
}
public void parse04() throws Exception {
// a、创建解析器对象
SAXReader saxReader = new SAXReader();
// b、把XML加载成Document文档对象
Document document =
saxReader.read(XPathDemo.class.getResourceAsStream("/Contacts2.xml"));
// c、检索数据
List nodes = document.selectNodes("//@id");
for (Node node : nodes) {
Attribute attr = (Attribute) node;
System.out.println(attr.getName() + "===>" + attr.getValue());
}
// 查询name元素(包含id属性的)
// Node node = document.selectSingleNode("//name[@id]");
Node node = document.selectSingleNode("//name[@id=888]");
Element ele = (Element) node;
System.out.println(ele.getTextTrim());
}
}
设计模式:工厂模式
工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一, 这种类型的设计模式属于创建型模式,它提供了一种获取对象的方式。
作用:工厂的方法可以封装对象的创建细节,如:为该对象进行加工和数据注入。可以实现类与类之间的解耦操作(核心思想)。
设计模式:装饰模式定义:建一个新类,包装原始类,从而在新类中提升原来类的功能。
作用:装饰模式指的是在不改变原类的基础上, 动态地扩展一个类的功能。
InputStream(抽象父类)FileInputStream(实现子类,读写性能较差)BufferedInputStream(实现子类,装饰类,读写性能高)
定义父类。
定义原始类,继承父类,定义功能。
定义装饰类,继承父类,包装原始类,增强功能!!



