xml语言,dtd约束是什么,xml的属性语法,xml文档的dom树的讲解
xml为可扩展的标记语言,它允许用户自定义标签,一个标签用于表述一段数据,一个标签有开始和结束,在开始和结束之间,又可以用其它标签描述数据。
在编写xml文档时,需要先使用文档申明,声明xml文档类型
元素 element
1元素是xml文档中最重要的组成部分
2普通元素的结构开始标签、元素体、结束标签组成。例如:<hello>大家好</hello>
3元素体:元素体可以是元素,也可以是文本,例如<b><a>您好</a></b>
4空元素:空元素只有开始标签,而且没有结束标签,但是元素必须自己闭合,例如<c/>
元素命名:
A区分大小写
B不能使用空格,不能使用冒号
C不建议以xml,Xml,XML开头
D不能以数字或者下划线开头
格式化良好的xml文档,必须只有一个根元素。
属性也要遵循如下规则:
A区分大小写
B不能使用空格,不能使用冒号
C不建议以xml,Xml,XML开头
D不能以数字或者下划线开头
在编写xml文件时,有些内容不可能不想让解析引擎解析,而当作原始内容处理,遇到这种情况时,可以把这些内容放到CDATA内,xml解析程序不会处理,而是原封不动的输出
什么是xml约束?
在xml约束技术里,可以编写一个文档来约束一个xml文档的书写规范,这个就是xml约束
常用的xml约束有两种技术 : xml dtd xml Schema
dtd是什么?
dtd的引入有三种方式
1. 内部dtd,在xml文档的内部嵌入DTD,只对当前XML有效
<? Xml version="1.0" encoding="utf-8" standalone="yes" ?>
<!DOCTYPE web-app[
….//具体的语法
]>
<web-app>
</web-app>
元素声明
元素名是自定义的,元素描述分为常见符号和常见类型
属性语法
一般来说dtd约束文档并非需要我们写,而是一般写好了,而我们只需要读懂它,然后根据约束文档,写我们所需要的xml文件,下面进行实例演练
<!ELEMENT web-app (servlet*,servlet-mapping* , welcome-file-list?) >
<!ELEMENT servlet (servlet-name,description?,(servlet-class|jsp-file))>
<!ELEMENT servlet-mapping (servlet-name,url-pattern+) >
<!ELEMENT servlet-name (#PCDATA)>
<!ELEMENT servlet-class (#PCDATA)>
<!ELEMENT url-pattern (#PCDATA)>
<!ELEMENT description (#PCDATA)>
<!ELEMENT jsp-file (#PCDATA)>
<!ELEMENT welcome-file-list (welcome-file+)>
<!ELEMENT welcome-file (#PCDATA)>
<!ATTLIST web-app version CDATA #IMPLIED>
这个dtd文档不是普通的文档,而是servlet2.3规范,
如果在xml使用当前DTD约束,必须包括DOCTYPE。格式如下:
#PCDATA为文本
一般dtd约束给定之后,我们根据这个dtd写xml文件,一般不唯一,因为有些东西可以写一个,也可以写多个,但基本上按照它的约束可以写出一个基本需要的xml文件
我们在引入dtd文档之后,在eclipse中写相应的xml文档会方便很多,原因就是它会给提示
下面按照dtd约束写xml,标签写一次或或多次的就写一次,这样演示翻遍
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app SYSTEM "web-app_2_3.dtd">
<web-app>
<servlet>
<servlet-name></servlet-name>
<servlet-class></servlet-class>
</servlet>
<servlet-mapping>
<servlet-name></servlet-name>
<url-pattern></url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file></welcome-file>
</welcome-file-list>
</web-app>
根据这个dtd写出来的xml就是servlet中常用的xml文件
Xml Schema是xml语言,是一种用于定义和描述xml文档结构与内容的模式语言,其出现是为了克服DTD的局限性
一个 xml Schema文档通常称之为模式文档(约束文档),遵循这个文档书写的xml文件称之为实例文档
和xml文件一样,一个xml Schema文档必须有一个根节点为Schema
如果一个xml文档中使用多个Schema文件,但当多个文件有同名的元素的时候就会发生冲突,所以命名空间可以理解为包,这样相同的名称的元素也不会发生问题
在xml Schema中,每个约束文档都可以被赋予一个唯一的名称空间,名称空间用唯一的url表示,在xml文件中书写标签时,名称空间可以通过xmlns来声明当前编写的标签来自哪个约束文档比如<huanfeng :书架 xmlns:huanfeng="http://huanfeng.cn">这句话的意思时申明一个名称空间"",给这个名称空间起一个别名huanfeng,以后用着方便
以后只要时""
可以理解为类似导入包一个意思,导入包之后就可以用包中的内容了
上面使用dtd写了一个约束文件,约束的内容是servlet的配置文件,下面的xsd也是约束servlet的文件
web-app_2_5.xsd
<xsd:schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.example.org/web-app_2_5"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:tns="http://www.example.org/web-app_2_5"
elementFormDefault="qualified">
<xsd:element name="web-app">
<xsd:complexType>
<xsd:choice minOccurs="0" maxOccurs="unbounded">
<xsd:element name="servlet">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="servlet-name"></xsd:element>
<xsd:element name="servlet-class"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="servlet-mapping">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="servlet-name"></xsd:element>
<xsd:element name="url-pattern" maxOccurs="unbounded"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="welcome-file-list">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="welcome-file" maxOccurs="unbounded"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:choice>
<xsd:attribute name="version" type="double" use="optional"></xsd:attribute>
</xsd:complexType>
</xsd:element>
</xsd:schema>
这个是schema的形式的servlet的约束文档,要想使用需要需要在xml文件中引入
<web-app xmlns="http://www.example.org/web-app_2_5"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.example.org/web-app_2_5 web-app_2_5.xsd"
version="2.5">
按照它的要求编写完成是这样的
Xsd文件中
xsd:element表示元素,按照这个约束写一般就只写这些元素,写的时候一般都有提示
xml解析
Xml dom和html dom差不多,xml dom将整个xml文档加载到内存,生成一个DOM树,并获得一个Document对象,并通过Document对象就可以对DOM进行操作
DoM的核心概念就是节点,在xml文档中元素,属性,文本等都是dom节点
这个文档都对应的dom树是
Dom4j必须使用核心类SaxReader加载xml获得document,并通过document获得根元素,然后通过下面的api来获取相应的元素
元素对象.attribute("属性名")获得指定属性名的属性对象.getValue();获得这个属性的值
或者直接 元素对象.attributeValue("属性名")
举例:
注意路径cn.huanfeng.xml,应该写成cn/huanfeng/xml,不宜该再写点了,为包路径