XML基础知识总结
Xml基础知识
写在前面:今天有时间就把以前学习JavaEE的时候记录的笔记总结了一下。
主要包含XMl的基础和解析技术。
1.XML属性
- xml的声明文件(必须写在第一行第一列)
vareion:版本 encoding:编码gbk utf-8
乱码是因为属性的编码情况和系统的不一样
2.XML得约束:排除一些不需要的条件
dtd约束:
1.创建后缀名为.dtd文件
1.看xml中有多少个元素,有多少个就在dtd中写几个<!ELEMENT>
2.看元素什么为简单元素(没有字元素)和复杂元素(含有子元素)
复杂元素:元素名称 (子元素名称)
简单元素:元素名称 (#PCDATA)
3.dtd文件的导入:
2.在xml中直接使用dtd约束
“]> 使用这种方法直接将dtd放在xml中
3.元素的约束:

1.简单元素的约束(没有子元素的约束)
(#PCDATA):元素为字符串类型
EMPTY:元素的值为空
ANY:随便什么都可以
2.复杂元素的约束(有子元素的约束)
都是放在样约束的后面
+:表示子元素出现一次或者多次
?:表示子元素出现零次或者一次
*:表示子元素随便都可以
子元素之间用逗号“,”隔开: 表示子元素出现的顺序
子元素之间用竖线“|”隔开: 表示子元素只能出现其中的任意一个
4.元素属性的定义:
属性类型:
CDATA:字符串类型的值
枚举类型:值必须为定义中的一个 定义(aaa|bbb|ccc)
ID:属性的值不能重复,且只能由字母下划线开头
属性约束:
#REQUIRED:表示该属性必须出现
#IMPLIED:表示该属性出现可有可无
#FIXED:该属性的值为固定值 语法:#FIXED “值”
直接为值:该值为属性的默认值
5.实体的定义
<ENTITY 实体名 “实体值”> 使用&实体名; 记得分号 一般都是写在内部定义的
Schema约束:
1.定义
Schema符合xml语法,xml语句。xml中可以包含多个Schema,通过名称空间来区分(类似于java的包),
可以直接用Int string 类型来定义,但是Schema更复杂。
2.创建一个Schema文件:
复杂元素:
<complexType>
<sequence>
简单元素:
</sequence>
</complexType>
<sequence> :出现的元素是按照顺序的
<all> :单个标签只能出现一个
<choice> :子标签只能出现一个
<any> :随便出现一个标签
maxOccurs=”unbounded” :在子标签中,表示标签可以出现无数次
<attribute> :定义属性,只有在复杂元素中才可以定义属性,在</complexType>前面写
两个Schema应用的时候,用引入Schema别名:标签名称
- 比如
<check:name></check:name>这种方法调用
在xml中引入约束xsd
xmlns:check=”http://www.w3.org/2001/XMLSchema-instance" “-instance”表示被约束的意思
check:schemaLocation=”http://www.example.org/jaxpText_02 jaxpText_02.xsd”
check是用户自定义的名称,xmlns:的值为xsd中targetNamespace的值
checj:schemaLocation=“targetNamespace的值 xsd的文件名称”
3.XML和java的结合
1.使用dom解析xml(内存中分配树装结构)
2.使用sax解析:采用事件驱动,边读变解析(从上到下,一行一行的解析,解析到一个对象,返回对象名)
4.XML的解析
1.dom解析
documentBuilder:解析器类
抽象类 不能直接new 要使用documentBuilderFactory.newdocumentBuilder调用
1.直接解析xml方法:parse(“xml路径”),返回整个Document文档
Document document = bulider.parse("XML路径");
2.document的父节点是Node
document的方法:
getElementsByTagName :返回得到的标签,集合
createElement :创建标签
createTextNode :创建文本内容
appendChild :将内容插到末尾(粘贴)
NodeLise(数组):
getlength() :获得数组的长度
item(数组) :获得当前位置的值
getTextContent() :得到标签中的内容
3.将在dom解析器中写的内容回写到xml中,利用这个方法回写
1 |
|
documentBuilderFactory :解析器工厂
_也是抽象类,使用newInstance()调用
DocumentBuilderFactory builderfactory = DocumentBuilderFactory.newInstance();创建实例builderfactory _
2.sax解析
SAXParser:解析类
通过SAXParserFactory .newSAXParser来得到;
parise(“xml路径”,”执行的事件”);
{
startElement():解析开始标签,返回qName:标签名称
characters() :解析文本内容,通过string构造方法返回
endElement() :解析结束标签,也是通过qName返回标签名称
} 都是自动完成的。
SAXParserFactory :解析器工厂通过newInstance()来得到。
3.dom4j解析(重点)
1.导入dom4j的包
2.得到document
1 | SAXReader reader = new SAXReader(); |
document的父接口是Node
document方法:
getRootElement:获取根节点,返回为Element,
Element的父接口也是Node
创建解析器
得到document
得到根节点
节点.element(“标签名称”):得到节点下第一个标签为“标签名称”的节点
节点.elements(”标签名称”):得到节点下第一层为“标签名称”的所有节点,为list类型,使用list.get(int)获取是第几个子标签
节点.element() :得到节点下第一层的所有标签,也是list类型。
使用getText()方法获得标签中的值
添加子标签直接使用.addElement(),添加文本直接使用setText().
指定位置插入一个标签:
主要是调用list中的add(”位置”,”标签的方法”);
所以在某一个复杂元素中插入必须是得到所有的简单元素
辅助方法:DocumentHelper.createElement(“标签名称”);来新建一个element
得到属性值(不需要回写xml):
- 标签名称.attributeValue (属性名称);
回写xml:
1 | OutputFormat format = OutputFormat.createPrettyPrint();//定义xml文件的样式 |
3.dom4j对于xpath的支持:
第一种形式:/aaa /bbb/ccc /表示一层
第二种形式://aaa //表示得到所有的
第三种形式:* *表示得到所有元素
第四种形式:/bbb[1] [1]表示第一个元素[last]表示最后一个元素
第五中形式://@属性名称 得到所有含有属性名称的元素
第六中形式://aaa[@属性名称=“值”] 表示名称为bbb并且属性名称为这个值得元素
4.dom4j对于xpach的操作
selectNodes(“xpath语句”):获取多个节点
selectSingleNode(“xpath语句”):获取单个节点