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.元素的约束:

DTD属性的定义.png

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




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
2
3
4
5
6
7

TransformerFactory factory = TransformerFactory.newInstance();

Transformer transformer = factory.newTransformer();

transformer.transform(new DOMSource(document), new StreamResult("src/jaxpText_01.xml""xml路径"));

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
2
3
SAXReader reader = new SAXReader();

Document document = reader.read(url);

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
2
3
4
5
6
7
OutputFormat format = OutputFormat.createPrettyPrint();//定义xml文件的样式

XMLWriter xmlWriter = new XMLWriter(new FileOutputStream("src/jaxpText_dom4j_01.xml"),format);//直接new XMLWriter的类传入两个参数第一个文件路径,第二个文件格式

xmlWriter.write(document);//写入的为document

xmlWriter.close();//关闭这个流

3.dom4j对于xpath的支持:

  • 第一种形式:/aaa /bbb/ccc /表示一层

  • 第二种形式://aaa //表示得到所有的

  • 第三种形式:* *表示得到所有元素

  • 第四种形式:/bbb[1] [1]表示第一个元素[last]表示最后一个元素

  • 第五中形式://@属性名称 得到所有含有属性名称的元素

  • 第六中形式://aaa[@属性名称=“值”] 表示名称为bbb并且属性名称为这个值得元素

4.dom4j对于xpach的操作

selectNodes(“xpath语句”):获取多个节点

selectSingleNode(“xpath语句”):获取单个节点