XML

来源:互联网 发布:淘宝开通直通车多少钱 编辑:程序博客网 时间:2024/05/29 03:26

XML

Extend Markup Languge(可扩展标签语言)

标签由开发者按照一定的语法自己制定的

作用:

  1. 描述带关系的数据(软件的配置文件): 包含与被包含的关系。用于tomcat,struts、Hibernate、spring (三大框架)等
  2. 作为数据的载体(存储数据,小型的“数据库”)


XML语法

xml文件以xml后缀名结尾。
xml文件需要使用xml解析器去解析。浏览器内置了xml解析器


标签:开始标签 标签体内容 结束标签:<student> </student> 

  1. <student/> 或 <student></student> 空标签。没有标签体内容
  2. xml标签名称区分大小写。
  3. xml标签一定要正确配对。
  4. xml标签名中间不能使用空格。
  5. xml标签名不能以数字开头。

   注意: 在一个xml文档中,有且仅有一个根标签。在XML中空格和换行都作为原始内容被处理,所以数据内容一般不要有空格换行

属性: <Student name="eric">student</Student>
注意:

  1. 属性值必须以引号包含,不能省略,也不能单双引号混用
  2. 一个标签内可以有多个属性,但不能出现重复的属性名
转义字符

<       &lt;

>       &gt;

"       &quot;

&       &amp;

空格       &nsbp;

CDATA块

作用:不想让解析引擎解析执行,可以让一些需要进行包含特殊字符的内容统一进行原样输出

<![CDATA[

<html><head>head</head><body>body</body></html>

]]>

注释<!-- xml注释 -->
文档声明
<?xml version="1.0" encoding="utf-8"?>

version: xml的版本号

encoding: 解析xml文件时查询的码表(解码过程时查询的码表)

   注意

  1. 如果在ecplise工具中开发xml文件,保存xml文件时自动按照文档声明的encoding来保存文件。
  2. 如果用记事本工具修改xml文件,注意保存xml文件按照文档声明的encoding的码表来保存。

处理指令
作用: 告诉xml解析如何解析xml文档

<?xml type="text/css" href="1.css"?>    href:告诉xml解析该xml文档引用了哪个css文件

<?xml-stylesheet type="text/css" href="1.css"?>    xml-stylesheet:只提取xml内容,不提取标签


XML解析:

xml文件除了给开发者看,更多的情况需要使用程序读取xml文件的内容。这叫做xml解析

解析方式(原理不同):DOM解析、SAX解析
解析工具

DOM解析工具:

  1. JAXP (oracle-Sun公司官方)
  2. JDOM工具(非官方)
  3. Dom4J工具(非官方)
三大框架(默认读取xml的工具就是Dom4j)

SAX解析工具:

Sax解析工具(oracle-sun公司官方)

--------------------------------------------DOM-------------------------------------------------------------------------------

DOM解析原理:

xml解析器一次性把整个xml文档加载进内存(读取大文件会造成内存溢出),然后在内存中构建一颗Document对象树,树上的分支叫节点,通过节点对象可以访问、设置xml文档的内容。

节点Node分为:标签节点Element(标签名称),属性节点Attribute(属性名称、属性值),文本节点Text(文本内容),注释节点

-----------------------------------Dom4j工具-----------------------------------------------------

Dom4j工具使用步骤

  1. 导入dom4j的核心包:dom4j-1.6.1.jar(非官方,不在jdk中)
  2. 编写Dom4j读取xml文件代码
读取xml文档方法:
首先获取一个xmk文件的Document对象//1.创建一个xml解析器对象SAXReader reader = new SAXReader();//2.读取xml文档,返回Document对象Document doc = reader.read(new File("路径.xml"));
节点:

Iterator   Element.nodeIterator();          获取当前标签节点下的所有子节点(不包括孙以下节点,返回Iterator)

   标签:(只有标签节点才有子节点)

Element    Document.getRootElement();         获取xml文档的根标签

Element   ELement.element("标签名");          获取指定名称的第一个子标签

Iterator<Element>   Element.elementIterator("标签名");          获取指定名称的所有子标签

List<Element>    Element.elements();          获取所有子标签

   属性:

String     Element.attributeValue("属性名")         获取指定名称的属性值

Attribute   Element.attribute("属性名")         获取指定名称的属性对象

Attribute.getName()          获取属性名称

Attibute.getValue()          获取属性值

List<Attribute>   Element.attributes();         获取所有属性对象

Iterator<Attribute>   Element.attibuteIterator();          获取所有属性对象

   文本:

Element.getText();         获取当前标签的文本

Element.elementText("标签名")          获取当前标签的指定名称的子标签的文本内容

修改xml文档步骤:
一、读取或创建一个Document对象

二、修改Document对象内容

   增加: 

Document doc =DocumentHelper.createDocument()          创建文档

addElement("名称")           增加标签。   //Element rootElem=doc.addElement("根标签")、rootElem.addElement("子标签")···一层层增加

addAttribute("名称",“值”)          增加属性

   修改:

Attribute.setValue("值")           修改属性值。   //先得到属性对象,然后修改属性值

Element.addAtribute("同名的属性名","值")          通过增加同名属性的方法,修改属性值

Element.setText("内容")          修改文本内容

   删除

Element.detach();          删除标签

Attribute.detach();          删除属性

三、把修改后的Document对象写出到xml文档中

//OutputFormat :指定写出的格式,指定生成与解析xml文档的编码OutputFormat format = OutputFormat.createCompactFormat();      //紧凑格式.去除空格换行.项目上线的时候用OutputFormat format = OutputFormat.createPrettyPrint();      //漂亮格式.有空格和换行.开发调试的时候用format.setEncoding("utf-8");//1.创建写出对象XMLWriter writer = new XMLWriter(OutputStream, OutputForamt);//2.写出对象wirter.write(Document);//3.关闭流writer.close();
-----------------------------xPath------------------------------------------------
使用dom4j查询比较深的层次结构的节点(标签,属性,文本)比较麻烦,所以引入xPath技术

xPath技术

一门独立的语言,主要是用于快速获取所需的节点对象。

使用步骤

  1. 导入xPath支持jar包 : jaxen-1.1-beta-6.jar
  2. 使用xpath方法

List<Node>   selectNodes("xpath表达式"+变量+"xpath表达式");       查询多个节点对象(可传入变量)

Node   selectSingleNode("xpath表达式");       查询一个节点对象

xPath语法:类似在一个文件系统中定位文件

/       绝对路径    表示从xml的根位置开始或子元素(一个层次结构)

//       相对路径    表示不分任何层次结构的选择所有符合规则的元素

*       通配符    表示匹配所有元素

[]       中间写条件    选择符合条件的元素。写数字表示位置、last()表示最后一个元素

@      后跟属性    表示选择哪种属性的属性节点

and      与关系    表示条件的与关系(等价于&&)

not()

text()       文本    表示选择文本内容

--------------------------------------------------------SAX-------------------------------------------------------------------

SAX解析原理:

从上往下,加载一点,读取一点,处理一点。对内存要求比较低

-----------------------------------SAX解析工具-----------------------------------------------------

Sun公司提供的。内置在jdk中:org.xml.sax.*

核心的API

SAXParser类: 用于读取和解析xml文件对象

parse(File f, DefaultHandler dh)       解析xml文件

参数一: File:表示读取的xml文件。

参数二: DefaultHandler: SAX事件处理程序。使用DefaultHandler的子类

使用步骤

//1.创建SAXParser对象SAXParser parser = SAXParserFactory.newInstance().newSAXParser();//2.调用parse方法parser.parse(new File("./src/contact.xml"), new MyDefaultHandler());   //MyDefaultHandler()继承DefaultHandler类,调用重写它的api。

DefaultHandler类的API:由SAX程序自动调用

void startDocument()           在读到文档开始时调用

void endDocument()          在读到文档结束时调用

void startElement(String uri, String localName, String qName, Attributes attributes)          读到开始标签时调用

qName: 表示开始标签的标签名

attributes: 表示开始标签内包含的属性列表

void endElement(String uri, String localName, String qName)          读到结束标签时调用

qName: 结束标签的标签名称

void characters(char[] ch, int start, int length)           读到文本内容时调用

ch: 表示当前读完的所有文本内容

start: 表示当前文本内容的在ch数组开始位置

length: 表示当前文本内容的长度

* * * * * * * * * * * * * * * * * * * * * * * * * * * *DOM解析 vs SAX解析 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

DOM解析

SAX解析

原理: 一次性加载xml文档,不适合大容量的文件读取

原理: 加载一点,读取一点,处理一点。适合大容量文件的读取

DOM解析可以任意进行增删改成

SAX解析只能读取

DOM解析任意读取任何位置的数据,甚至往回读

SAX解析只能从上往下,按顺序读取,不能往回读

DOM解析面向对象的编程方法(Node,Element,Attribute),Java开发者编码比较简单。

SAX解析基于事件的编程方法。java开发编码相对复杂。

=============================================================================

XML约束

XML语法: 规范的xml文件的基本编写规则。(由w3c组织制定的)
XML约束: 规范XML文件数据内容格式的编写规则。(由开发者自行定义)
----------------------------------------------------------------------------------------------------------

XML约束技术:
DTD约束:语法相对简单,功能也相对简单。学习成本也低。
Schema约束:语法相对复杂,功能也相对强大。学习成本相对高!

----------------------------------------------------------------------------------------------------------

DTD约束

导入dtd方式

内部导入

<!DOCTYPE 根元素 [

约束标签

]>

外部导入

本地文件系统:

<!DOCTYPE 根元素 SYSTEM "文件名.dtd">

公共的外部导入:

<!DOCTYPE 根元素 PUBLIC "http://路径/文件名">


1.约束标签语法
<!ELEMENT 元素名称 类别> 或 <!ELEMENT 元素名称 (元素内容)>
  类别:

  1. 空标签: EMPTY。    表示元素一定是空元素。
  2. 普通字符串: (#PCDATA)。   表示元素的内容一定是普通字符串(不能含有子标签)。
  3. 任何内容: ANY。   表示元素的内容可以是任意内容(包括子标签) 
  (元素内容):
      顺序问题:

<!ELEMENT 元素名称 (子元素名称 1,子元素名称 2,.....)>      表示按顺序出现子标签

      次数问题:

标签 : 必须且只出现1次。

标签+ : 至少出现1次

标签* : 0或n次。

标签? : 0 或1次

2.约束属性语法
<!ATTLIST 元素名称 属性名称 属性类型 默认值>
  默认值:

#REQUIRED    属性值是必需的

#IMPLIED      属性不是必需的

#FIXED value    属性不是必须的,但属性值是固定的

  属性类型:控制属性值的

CDATA      表示普通字符串

(en1|en2|..)      表示一定是枚举列表中的一个值

ID     表示在一个xml文档中该属性值必须唯一。且不能以数字开头

Schema约束

XML Schema 也是一种用于定义和描述 XML 文档结构与内容的模式语言,其出现是为了克服 DTD 的局限性
XML Schema符合XML语法结构。 DOM、SAX等XML API很容易解析出XML Schema文档中的内容。 对名称空间支持得非常好。 比XML DTD支持更多的数据类型,并支持用户自定义新的数据类型。 定义约束的能力非常强大,可以对XML实例文档作出细致的语义限制。
XML Schema不能像DTD一样定义实体,比DTD更复杂,但Xml Schema现在已是w3c组织的标准,它正逐步取代DTD


XML Schema 文件自身就是一个XML文件根结点的名称为Schema,但它的扩展名通常为.xsd
一个XML Schema文档通常称之为模式文档(约束文档),遵循这个文档书写的xml文件称之为实例文档。

名称空间:告诉xml文档的哪个元素被哪个schema文档约束。 在一个xml文档中,不同的标签可以受到不同的schema文档的约束






原创粉丝点击