XML
eXtensible Markup Language 可扩展标记语言。xml 是w3c组织发布的技术。xml 由俩个版本:1.0、1.1 。当前使用的都是1.0版本,因为1.1版本不能向下兼容。
xml 可以显示数据,但不是主要功能。主要功能是为了存储数据。
应用:
1、不同系统之间数据传输。
2、用来标识生活中有关系的数据。
3、作为配置文件。
语法:
1、xml 的文档声明
<?xml version="1.0" encoding="dbk"?>
声明文档必须要写在第一行第一列
version:版本。
encoding:编码。
standalone:是否依赖其他文件 yes/no 。
2、定义元素(标签)
<abc></abc>
<abc />
3、定义属性
4、注释
5、特殊字符
6、CDATA区
解决特殊字符频繁转移的操作。
格式:
<![CDATA[内容]]>
7、PI指令(处理指令)
设置 xml 的样式。
格式:
<?xml-stylesheet type="text/css" href="css文档路径"?>
约束:
dtd约束、schema约束。
dtd约束:
1、创建 .dtd 文件
2、xml 中由几个元素 dtd 文件中就写几个 <!ELEMENT>
3、判断元素是否简单元素还是复杂元素
复杂元素:由子元素的元素
<!ELEMENT 元素名称(子元素,子元素,子元素...)>
简单元素:物资元素的元素
<!ELEMENT 元素名称(#PCDATA)>
4、在 xml 文件中引入 dtd 文件
<!DOCTYPE 根元素名称 SYSTEM "dtd 文件路径">
5、dtd 的引入方式
a、引入外部的 dtd 文件
<!DOCTYPE 根元素名称 SYSTEM "dtd 文件路径">
b、使用内部 dtd 文件
直接在内部书写 dtd 文件内容
<!DOCTYPE 根元素名称[
<!ELEMENT 元素名称(子元素,子元素,子元素...)>
<!ELEMENT 元素名称(#PCDATA)>
]>
c、使用外部(网络上)的 dtd 文件
<!DOCTYPE 根元素 PUBLIC "DTD名称" "DTD文档的URL">
struts2 跨甲的配置文件使用外部 dtd 文件方式。
6、使用 dtd 定义元素
格式:
<!ELEMENT 元素名 约束>
简单元素约束:
<!ELEMENT 元素名称(#PCDATA)/EMPTY/ANY>
(#PCDATA):约束元素为字符串类型
EMPTY:元素为空(没有内容)
ANY:任意
复杂元素约束:
<!ELEMENT 元素名称(子元素,子元素,子元素...)>
当前这种写法子元素只能出现一次
表示子元素出现的次数:
+:表示子元素可以出现一次或多次。
?:表示子元素可以出现0次或一次。
*:表示子元素可以出现0次或多次。
子元素直接使用逗号","隔开表示:子元素出现的顺序
子元素直接使用"|"隔开表示:元素只能出现定义范围内的任意一个
7、使用 dtd 定义属性:
格式:
<!ELEMENT 元素名称 (#PCDATA)/EMPTY/ANY>
<!ATTLIST 元素名称
元素名称 属性类型 属性约束
...
>
属性类型:
CDATA:字符串。
枚举:只能在一定范围内出现值,但只能每次出现其中一个。
格式:(aa|bb|cc)
ID:值只能是字母/下划线开头。
属性约束:
#REQUIRED:属性必须存在
#IMPLIED:属性可有可无
#FIXED:一个固定值。
格式:属性名 属性类型 #FIXED "值"
属性值必须是设置的这个值
直接值:
格式:属性名 属性类型 “值”
若在元素中不存在该属性,则直接使用该设置的值
若在元素中存在该属性,则使用该属性中的值
8、dtd 实体的定义
格式:
<!ENTITY 实体名称 "实体的值">
在元素中使用实体,可以直接获取到实体的值
格式:@实体名称;
注:定义实体需要写在内部的 dtd 中,若写在外部的 dtd 中,在某些浏览器下内容会获取不到。
schema约束:
schema 符合 xml 语法,xml 语句。
一个 xml 中只能由一个 dtd,但可以由多个 schema,多个 schema 使用命名空间来区分(类似与Java包名)。dtd中由PCDATA类型,但 schema 中可以支持更多的数据类型。由此可见 schema 约束更加严格,但 schema 语法更加复杂。
schema 文件自身就是一个 xml 文件。但后缀名:.xsd 。跟节点:<schema> 在<schema> 文件中由w3c提供的属性和标签,来约束 xml 文件。
<schema> 根元素中有一些属性:
xmlns="http://www.w3.org/2001/XMLSchema" :表示当前 xml 文件是一个约束文件
targetNamespace="url":使用 schema 约束文件,直接通过这个地址引入约束文件
enementFormDefault="qualified":质量良好
复杂元素:
<complexType>
<sequence>
子元素
</sequence>
</complexType>
简单元素:写在复杂元素的<sequence>下
<element name="父元素">
<complexType>
<sequence>
<element name="元素" type="类型"></element>
</sequence>
</complexType>
</element>
被约束文件引入约束文件
在 xml 文件的根元素中写入属性
xmlns:xsi="schema文件的xmlns的url-instance":表示 xml 是一个被约束文件
xmlsn="schema文件的targetNamespace的url":是约束文档中的targetNmaespace
xsi:schemaLocation="schema文件的targetNamespace的url schema文件路径.xsd" targetNamespace "空格" 约束文档的地址路径
complexType下的元素:
sequence:子元素出现的顺序
all:子元素只能出现一次
choice:子元素只能出现其中的一个
maxOccurs="unbounded":元素出现的次数;unbounded次数不限制
例:<element name="元素" type="类型" maxOccurs="unbounded"></element>
any:任意元素
复杂元素下定义的约束属性:
在</complexType>之前定义 <attribute name="属性名称" type="属性类型" use="required"></sttribute>
use:属性是否必须出现。required:必须出现
名称空间:
xml文件引入多个schema约束文件时,需要在xmlns后跟别名
例:xmlns:别名="url"
若使用别名所指向的约束文件,在定义元素时需要:
<别名:元素></别名:元素>
XML解析:
xml 是标记型文档。
js 使用 dom 解析标记型文档:根据html的层级结构,在内存中分配一个属性结构,把html的标签、属性和文本都封装成对象。document对象、element对象、属性对象、文本对象、Node节点对象。
XML的解析方式:dom 与 sax
dom解析:
根据xml的层级结构,在内存中分配一个树形结构;把xml中每部分都封装成对象。
缺点:使用dom方式解析xml时,若xml文件过大,会造成内存溢出。
优点:方便实现增、删、改操作。
sax解析:
采集时间驱动,边读边解析。从上到下,一行一行的解析,解析到某个对象,把对象名称返回。
优点:使用sax方式不会造成内存溢出,方便实现查询。
缺点:不能实现增、删、改操作。
解析器 XML解析开发包:
sum公司提供了针对dom、sax的解析器:jaxp
dom4j组织提供了针对dom、sax的解析器:dom4j
jdom组织提供了针对dom、sax的解析器:jdom
1、jaxp:
jaxp是JavaSE的一部分。在 jdk 的 javax.xml.parsers 包中存在四个分别针对dom和sax解析使用的类。
dom:
DocumentBuilder:解析类。该类为抽象类,不能new,但可以从DocumentBuilderFactory.newDocumentBuilder()获取实例;用Document parse("xml-path")解析xml,返回的document是一个接口,父节点是Node,若在document中找不到理想的方法,则在Node中查找。
DocumentBuilderFactory:解析器工厂。该类为抽象类,不能new,可以从newInstance()获取DocumentBuilderFactory的实例。
sax:
SAXParser:解析器类。该类为抽象类,不能new,但实例可以从SAXParserFactory.newSAXParser()来获取;用parse(File f,DefaultHander dh)解析xml。第一个参数 File f:xml路径。第二个参数DefaultHander dh:事件处理器。
SAXParserFactory:解析器工厂。该类为抽象类,不能new,但实例可以从newInstance()来获取。
实例:jaxp的dom方式操作xml文件
//创建解析工厂 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); //创建解析器 DocumentBuilder bd = dbf.newDocumentBuilder(); //解析xml文件 Document document = bd.parse("xmlpath"); //获取元素 NodeList nodelist=document.getElementsByTagName("元素"); for(int i=0;i>nodelist.getLength();i++){ Node node=nodelist.item(i)//获取每一个元素 String str=node.getTextContent();//获取元素的内容 } //获取第几个元素/值 Node node=nodelist.item(int); String str=node.getTextContent(); //jaxp使用dom添加节点 NodeList nodelist=document.getElementsByTagName("元素"); Node node=nodelist.item(int); Element ele=document.createElement("new元素"); Text text=document.createTextNode("内容"); ele.appendChild(text); node.appendChild(ele); //回写xml TransformerFactory tf=TransformerFactory.newInstance(); Transformer transformer=tf.newTransformer(); transformer.transform(new DOMSource(document),new StreamResult("xmlpath"); //jaxp使用dom修改节点 NodeList nodelist=document.getElementsByTagName("元素"); Node node=nodelist.item(int); node.setTextContent("修改的内容"); //回写xml TransformerFactory tf=TransformerFactory.newInstance(); Transformer transformer=tf.newTransformer(); transformer.transform(new DOMSource(document),new StreamResult("xmlpath"); //jaxp使用dom删除节点 NodeList nodelist=document.getElementsByTagName("元素"); Node node=nodelist.item(int); Node nodeDelete=node.getParentNode(); nodeDelete.removeChild(node); //回写xml TransformerFactory tf=TransformerFactory.newInstance(); Transformer transformer=tf.newTransformer(); transformer.transform(new DOMSource(document),new StreamResult("xmlpath"); /*jaxp使用dom遍历节点 * 递归遍历 */Node为Document的父类 故使用node.getChildNodes(); String strNode=""; strNode=NodeListDocument(document,strNode); public String NodeListDocument(Node node,String nodes){ if(node.getNodeType()==Node.ELEMENT_NODE){ nodes+=node.getNodeName(); } NodeList nodelist=document.getChildNodes(); for(int i=0;i<nodelist.getLength();i++){ Node nd=nodelist.item(i); NodeListDocument(nd,nodes); } return nodes; }