XML
来源:互联网 发布:淘宝开通直通车多少钱 编辑:程序博客网 时间:2024/05/29 03:26
XML
Extend Markup Languge(可扩展标签语言)
标签由开发者按照一定的语法自己制定的
作用:
- 描述带关系的数据(软件的配置文件): 包含与被包含的关系。用于tomcat,struts、Hibernate、spring (三大框架)等
- 作为数据的载体(存储数据,小型的“数据库”)
XML语法:
xml文件以xml后缀名结尾。
xml文件需要使用xml解析器去解析。浏览器内置了xml解析器
标签:开始标签 标签体内容 结束标签:<student> </student>
- <student/> 或 <student></student> 空标签。没有标签体内容
- xml标签名称区分大小写。
- xml标签一定要正确配对。
- xml标签名中间不能使用空格。
- xml标签名不能以数字开头。
注意: 在一个xml文档中,有且仅有一个根标签。在XML中空格和换行都作为原始内容被处理,所以数据内容一般不要有空格换行
属性: <Student name="eric">student</Student>
注意:
- 属性值必须以引号包含,不能省略,也不能单双引号混用
- 一个标签内可以有多个属性,但不能出现重复的属性名
< <
> >
" "
& &
空格 &nsbp;
CDATA块
作用:不想让解析引擎解析执行,可以让一些需要进行包含特殊字符的内容统一进行原样输出
<![CDATA[
<html><head>head</head><body>body</body></html>
]]>
注释: <!-- xml注释 -->
文档声明: <?xml version="1.0" encoding="utf-8"?>
version: xml的版本号
encoding: 解析xml文件时查询的码表(解码过程时查询的码表)
注意:
- 如果在ecplise工具中开发xml文件,保存xml文件时自动按照文档声明的encoding来保存文件。
- 如果用记事本工具修改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解析工具:
- JAXP (oracle-Sun公司官方)
- JDOM工具(非官方)
- Dom4J工具(非官方)
三大框架(默认读取xml的工具就是Dom4j)
SAX解析工具:
Sax解析工具(oracle-sun公司官方)
--------------------------------------------DOM-------------------------------------------------------------------------------
DOM解析原理:
xml解析器一次性把整个xml文档加载进内存(读取大文件会造成内存溢出),然后在内存中构建一颗Document对象树,树上的分支叫节点,通过节点对象可以访问、设置xml文档的内容。
节点Node分为:标签节点Element(标签名称),属性节点Attribute(属性名称、属性值),文本节点Text(文本内容),注释节点
-----------------------------------Dom4j工具-----------------------------------------------------
Dom4j工具使用步骤:
- 导入dom4j的核心包:dom4j-1.6.1.jar(非官方,不在jdk中)
- 编写Dom4j读取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("内容") 修改文本内容
删除
三、把修改后的Document对象写出到xml文档中Element.detach(); 删除标签
Attribute.detach(); 删除属性
//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技术
一门独立的语言,主要是用于快速获取所需的节点对象。
使用步骤:
- 导入xPath支持jar包 : jaxen-1.1-beta-6.jar
- 使用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 元素名称 (元素内容)>
类别:
- 空标签: EMPTY。 表示元素一定是空元素。
- 普通字符串: (#PCDATA)。 表示元素的内容一定是普通字符串(不能含有子标签)。
- 任何内容: 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文档的约束
- XML
- XML
- XML
- XML
- xml
- xml
- XML
- XML
- XML
- xml
- xml
- XML
- XML
- xml
- xml
- xml
- XML
- XML
- 活动的四种启动模式(第一行代码总结)
- hdu 6138 Fleet of the Eternal Throne (ac自动机)
- MFC中遇到的关于error C4430: 缺少类型说明符
- 647. Palindromic Substrings
- 二叉排序树
- XML
- servlet生命周期
- CURL使用SSL证书访问HTTPS
- 最长递增子序列问题
- html ifram应用
- bzoj 4993: [Usaco2017 Feb]Why Did the Cow Cross the Road II
- codeforces 841D Leha and another game about graph
- [Leetcode] 99, 114, 117
- Mac OSX系统、Linux、Windows命令行教程