文章目录
实际开发中,不同语言项目之间的数据传递格式可能不兼容,为解决此问题,W3C组织推出一种数据交换标准——XML。它是一种通用的数据交换格式,可以使得数据在各种应用程序之间实现数据交换。
我们在某些业务场景下,存储数据或者传输数据给别人的时候,数据需要满足一定的规范进行组织(XML)。把XML文件中数据提取出来是(XML解析技术)。方便的在XML文件中进行数据的检索用(XPath)。
XML
(Extensible Markup Language)可扩展标记语言的缩写,它是一种数据表示形式,可以描述复杂的数据结构,常用于传输和存储数据。
(1)标签名可以随便取,允许标签嵌套
(2)纯文本,默认使用UTF-8编码
(3)如果把XML内容存为文件,那它就是一个XML文件,后缀名.xml
(4)XML内容当成消息进行网络传输或者作为配置文件用于存储系统的信息
XML的创建和语法规则
第一行必为文档声明,用来表示该文档是一个XML文档,以及遵循的XML版本规范。
<?xml [版本信息][编码信息][文档独立性信息]?>
standalone="yes":声明该文档是否为独立文档。默认情况下为no,表示文档依赖于外部文档。
根标签:一个元素没有被嵌套在其他元素之中。
空标签:一个元素中没有子元素也没有文本内容。可以简写为
<img/>
(1)标签由一堆尖括号和合法标识符组成,必须只有一个根标签。
(2)标签必须成对出现,有出现,有结束。
(3)特殊的标签可以不重复,但是必须有结束标记。
(4)标签中可以定义属性,属性和标签名空格隔开,属性值必须用引号括起来。
<student id="1">
(5)特殊字符:
XML文件中可以存在CDATA区: <![CDATA[ …内容… ]]>
,在这里面可以不用写特殊字符的符号。
HTML和XML的不同点
xml用于传输数据,html用于格式化并且显示数据。还有一个常见版本——XHTML,是被XML重新定义过的html,是更加严格纯净的版本。
html | xml |
---|---|
显示数据 | 传输和存储数据 |
不区分大小写 | 严格区分大小写 |
可以有多个根元素 | 严格只有一个根元素 |
空格自动过滤 | 空格不会删除 |
标记预定义 | 标记需要自己定义 |
文档约束
限定xml文件中的标签和属性应该怎么写,以此强制约束程序员必须按照文档约束的规定编写xml文件。
DTD约束
步骤:
(1) 编写后缀为.dtd的文件
(2)在需要编写的XML文件中导入DTD约束文档。
<!DOCTYPE 根元素名称 SYSTEM "外部DTD文件的URI">
//引用本地的DTD文件 URI是指相对于XML文档的相对路径,也可以是绝对路径
<!DOCTYPE 根元素名称 PUBLIC "DTD名称" "外部DTD文件的URI">
//引用公共的DTD文件 它是Internet上的一个绝对的URL地址
(3)按照约束的规定编写XML文件的内容。
schema约束
①:编写schema约束文档,后缀必须是.xsd.
②:在需要编写的XML文件中导入该schema约束文档.
③:按照约束内容编写XML文件的标签。
XML解析技术
XML的数据作用:存储数据,做配置信息,进行数据传输+最终需要被程序进行读取,解析里面的信息。
DOM常见的解析工具:
Dom4J解析XML文件
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 {
/**
1.绝对路径: /根元素/子元素/子元素。
*/
public void parse01() throws Exception {
// a、创建解析器对象
SAXReader saxReader = new SAXReader();
// b、把XML加载成Document文档对象
Document document =
saxReader.read(XPathDemo.class.getResourceAsStream("/Contacts2.xml"));
// c、检索全部的名称
List<Node> nameNodes = document.selectNodes("/contactList/contact/name");
for (Node nameNode : nameNodes) {
Element nameEle = (Element) nameNode;
System.out.println(nameEle.getTextTrim());
}
}
/**
2.相对路径: ./子元素/子元素。 (.代表了当前元素)
*/
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<Node> nameNodes = root.selectNodes("./contact/name");
for (Node nameNode : nameNodes) {
Element nameEle = (Element) nameNode;
System.out.println(nameEle.getTextTrim());
}
}
/**
3.全文搜索:
//元素 在全文找这个元素
//元素1/元素2 在全文找元素1下面的一级元素2
//元素1//元素2 在全文找元素1下面的全部元素2
*/
public void parse03() throws Exception {
// a、创建解析器对象
SAXReader saxReader = new SAXReader();
// b、把XML加载成Document文档对象
Document document =
saxReader.read(XPathDemo.class.getResourceAsStream("/Contacts2.xml"));
// c、检索数据
//List<Node> nameNodes = document.selectNodes("//name");
// List<Node> nameNodes = document.selectNodes("//contact/name");
List<Node> nameNodes = document.selectNodes("//contact//name");
for (Node nameNode : nameNodes) {
Element nameEle = (Element) nameNode;
System.out.println(nameEle.getTextTrim());
}
}
/**
4.属性查找。
//@属性名称 在全文检索属性对象。
//元素[@属性名称] 在全文检索包含该属性的元素对象。
//元素[@属性名称=值] 在全文检索包含该属性的元素且属性值为该值的元素对象。
*/
public void parse04() throws Exception {
// a、创建解析器对象
SAXReader saxReader = new SAXReader();
// b、把XML加载成Document文档对象
Document document =
saxReader.read(XPathDemo.class.getResourceAsStream("/Contacts2.xml"));
// c、检索数据
List<Node> 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(实现子类,装饰类,读写性能高)
定义父类。
定义原始类,继承父类,定义功能。
定义装饰类,继承父类,包装原始类,增强功能!!