XML
概念
XML(eXtensible Markup Language),是一种可扩展的标记语言,类似HTML(超文本标记语言)。
XML是一种通用的数据交换格式
1.通常用来作为配置文件(框架的配置文件都会使用XML)
2.作为数据交换(与平台的无关性)
3.文档清晰,方便管理数据(properties键值对,XML 文档相当于一个树形结构)
语法
<? xml version="1.0" encoding="utf-8" ?>
单标签 只有一个 <name/>
双标签 有开始有结尾 <name></name>
标签名字 不建议使用中文标签
特殊的地方: lt(less than) gt(greater than) 表示小于符号< 大于符号 >
对于要转义的地方 <![CDATA[内容]]>
注意事项
1.一个XML文件只能有一个根节点
2.XML标签命名自定义【推荐英文】,标签名中不能包含空格
3.XML空格和换行都表示数据,严格区分大小写
4.XML中特殊字符表示的数据需要使用特殊字符编码和HTML一样
5.CDATA区中的数据不会被识别为语法
约束
XML约束的目的:规范XML中书写的内容,XML约束分为:DTD约束、Schema约束(其本身也是一个xml)
DTD约束
DTD约束文件与XML文件关联
<!DOCTYPE 文档根结点 SYSTEM "DTD文件的URL">
<!DOCTYPE contacts SYSTEM “contacts.dtd”>
DTD细节
<!--contacts下有一个或多个linkman,+代表起码一个-->
<!ELEMENT contacts (linkman+)>
<!--linkman下包含有按顺序的四个标签-->
<!ELEMENT linkman (name,email,address,group)>
<!--给标签内填充数据内容-->
<!ELEMENT name (#PCDATA)>
<!ELEMENT email (#PCDATA)>
<!ELEMENT address (#PCDATA)>
<!ELEMENT group (#PCDATA)>
<!--使用dtd定义属性-->
<!ATTLIST 元素名称 属性名称 属性类型 属性约束>
1. 声明一个标签下有嵌套子标签,多个不同标签使用逗号隔开
2. 声明标签下是直接的内容,#PCDATA代表数据的意思,官方说法叫被解析的字符数据
属性类型:
-CDATA :表示字符串
-枚举:表示只能出现范围内的一种值
-ID:属性只能以字母下划线开头
属性值的约束:
#REQUIRED:表示必须出现
#IMPLIED:表示该属性可有可无
#FIXED:表示该属性的取值为一个固定值 语法: #FIXED "固定值"
注意:DTD约束中若出现错误,不会报错
Schema约束
Schema约束本质上来说,是一个XML,Schema约束和DTD约束最大的区别就在于:前者使用XML语法来约束Schema本身的内容,写错就会报错,但Schema同样也存在致命的缺点,那就是约束本身语法实在有些复杂。
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.w3school.com.cn"
xmlns="http://www.w3school.com.cn"
elementFormDefault="qualified">
...
...
</xs:schema>
优点:
- XML Schema 可针对未来的需求进行扩展
- XML Schema 更完善,功能更强大
- XML Schema 基于 XML 编写
- XML Schema 支持数据类型
- XML Schema 支持命名空间
要求:
- 它必须以 XML 声明开头
- 它必须拥有唯一的根元素
- 开始标签必须与结束标签相匹配
- 元素对大小写敏感
- 所有的元素都必须关闭
- 所有的元素都必须正确地嵌套
- 必须对特殊字符使用实体
限定 | 描述 |
---|---|
enumeration | 定义可接受值的一个列表 |
fractionDigits | 定义所允许的最大的小数位数。必须大于等于0 |
length | 定义所允许的字符或者列表项目的精确数目。必须大于或等于0 |
maxExclusive | 定义数值的上限。所允许的值必须小于此值 |
maxInclusive | 定义数值的上限。所允许的值必须小于或等于此值 |
maxLength | 定义所允许的字符或者列表项目的最大数目。必须大于或等于0 |
minExclusive | 定义数值的下限。所允许的值必需大于此值 |
minInclusive | 定义数值的下限。所允许的值必需大于或等于此值 |
minLength | 定义所允许的字符或者列表项目的最小数目。必须大于或等于0 |
pattern | 定义可接受的字符的精确序列 |
totalDigits | 定义所允许的阿拉伯数字的精确位数。必须大于0 |
whiteSpace | 定义空白字符(换行、回车、空格以及制表符)的处理方式 |
XML解析
dom对象 document-- element (attr text)
原生API解析XML
概念:首先获取工厂对象,再通过工厂对象创建builder对象,再通过builder对象获得dom对象
,获取根节点,通过根节点去获取其他标签,然后对标签的文本、属性、进行增删改查
注意:增加、修改、删除需要回写(dom和file)
代码实现步骤:
- 获取解析器工厂对象
- 解析器工厂对象创建解析器对象
- 解析器解析实体XML文件返回Document对象
API:
DocumentBuilderFactory类:
DocumentBuilderFactory.newInstance()
创建解析器工厂对象
DocumentBuilder newDocumentBuilder()
返回一个解析器对象
DocumentBuilder类:
Document parse(File file)
解析XML文件,并返回一个Document对象
查询
API
Document接口:
Element getDocumentElement()
获取根元素
NodeList getElementsByTagName(标签名称)
根据标签名称获取到节点集合
NodeList接口:
Node item(下标索引)
Element接口:
String getTextContent()
修改
在XML解析的过程中,若对数据进行了修改操作,那么Java代码实际上只对内存中的这个对象进行了修改操作,要将最后的修改实际保存到文件中,还需要将当前内存中的数据输出保存到实际的XML,这个时候需要使用到Transformer类
API
Node接口:
void setTextContent(设置的值)
设置节点中的文本内容
TransformerFactory类:
TransformerFactory newInstance()
创建转换器新实例对象
Transformer newTransformer()
创建一个新的转换器
Transformer类:
void transformer(数据源,结果)
将内存中的DOM模型数据,写入实体文件中
DOMSource(内存的文档对象中)
StreamResult(实体文件关联)
增加
添加一个联系人信息
API
Element接口:
Element createElement(标签名称)
创建一个新的标签
void appendChild(Element对象)
将一个标签添加到另一个标签中
void setAttribute(属性名,属性值)
给标签添加一个属性
String getAttribute(属性名)
根据属性名获取值
删除
删除新增加的节点
API
注意:删除节点的时候,需要使用元素本身的父节点去删除
Node接口:
Node getParentNode()
获取父节点
void removeChild(Element对象)
删除子节点
Dom4j解析
特点
-
dom4j将dom解析和sax解析融合到一起,既保证了性能也增强了功能(而且可以使用xpath路径表达式)
-
dom4j是第三方提供的,所以在使用时需要导入jar包
获取Document对象语法
SAXReader类:
Document read(File类型)
//获取一个Document对象
查询
Document接口:
Element getRootElement()
获取文档中的根节点
Element接口:
Element element(标签名)
获取单个标签,返回子标签下的第一个
List elements(标签名)
获取多个标签,返回集合对象
String elementText(标签名)
返回标签中的文本数据
修改
Document接口:
void write(Write类型)
将内存数据关联给一个字符输出流
Element接口:
void setText(设置值)
设定标签中的文本数据
增加
Element接口:
Element addElement(标签名)
添加一个标签
XMLWriter类:格式友好的输出形式
XMLWriter(Writer writer,OutputFormat format)
构造一个具有良好输出格式的XML输出对象
void write(Node node)
将一个document输出到实体文件中
void close()
关闭输出
OutputFormat类:输出格式类
OutputFormat createPrettyPrint()
构造一个良好的格式对象
删除
Element接口:
Element getParent()
获取父标签
Boolean remove(Element对象)
删除指定标签
对于含有约束的xml解析
//要设置xml的命名空间
SAXReader reader = new SAXReader();
HashMap<String, String> map = new HashMap<>();
map.put("t", "http://itsource.cn");
reader.getDocumentFactory().setXPathNamespaceURIs(map);
Document dom = reader.read(new File("resources/contacts.xml"));
Node node = dom.selectSingleNode("/t:contacts/t:linkman[1]/t:name");
System.out.println(node.getText());