XML基础知识

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)  表示小于符号&lt; 大于符号 &gt;
    对于要转义的地方   <![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)

代码实现步骤:

  1. 获取解析器工厂对象
  2. 解析器工厂对象创建解析器对象
  3. 解析器解析实体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解析

特点
  1. dom4j将dom解析和sax解析融合到一起,既保证了性能也增强了功能(而且可以使用xpath路径表达式)

  2. 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());

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值