- 概述
i、XML的基本概念
- XML(Extensible Markup Language,可扩展标记语言)。
- 允许开发者自由定义标签,可以将标签和内容有效分离。
- XML不再侧重于数据如何展示,而是更多地关注数据如何存储和传输。
ii、XML的应用场景
- XML把数据从HTML分离出来。
- 简化数据共享。
- 简化数据的传输。
- 简化平台的变更。
iii、XML的优势
- 简单易用的标记语言。
- 严格的格式。
- 数据逻辑和显示逻辑分离。
- XML文档规则
i、XML整体结构
- 有且只有一个根元素。
- 元素必须合理结束。
- 元素之间必须合理嵌套。
- 元素的属性必须有值。
ii、XML声明
<?xml version="1.0"encoding="GB2312"standalone="yes"?>
Ps:standalone表示该xml是不是独立的,如果是yes,则表示这个XML文档时独立的,不能引用外部的DTD规范文件;如果是no,则该XML文档不是独立的,表示可以用外部的DTD规范文档。
iii、合法标签名
- XML元素由开始标签和结束标签组成,结束标签比开始标签多一条斜线。
- XML文档区分大小写。因此,开始标签和结束标签名必须绝对相同,大小写也要完全一致。
iv、嵌套子元素
- XML允许无限深度嵌套子元素,只要保证元素之间合理嵌套即可。
- XML元素可以嵌套多个重名的子元素,这多个元素之间是有序的。
v、空元素
- XML允许使用空元素语法,空元素不可接受子元素,也不可接受字符串内容。
- 空元素和内容为空的元素并不相同。
- 空元素只是不能包含子元素,也不能包含字符串内容,但完全可以接受属性,而且可以接受任意多个属性。
vi、字符数据
开始标签和结束标签之间的文本可以是任何Unicode字符,并且其间的任何字符都将忠实地传递给XML处理程序。如果文本字符串中包含一些特殊的字符,例如尖括号(<)或and符号(&),由于这些符号在XML文档中都有特殊的含义,因此直接在XML元素中使用该字符串将引起文档混乱。
1. 使用实体引用
为了正确处理XML文档中的特殊字符,XML允许使用实体来表示这些特殊字符。
XML预置了5个实体引用,如表:
注意:只有“<”和“&”会引起混乱,所以这两个一定要用转义字符,但是为了可读性,其他也通常一律用转义字符。
2. 使用CDATA标记
在特殊标记CDATA下,所有的特殊字符,甚至是有效的元素都将被当成简单字符处理实体引用也会失去作用,变成纯文本
语法:<![CDATA[文本内容]]>。
v、注释
语法:<!--注释字符串-->。
XML注释需要注意的地方:
1.不要把注释放在标签之内,否则,该文档将不是一个格式良好的XML文档。
2.不要把注释放在XML声明之前,XML声明应该永远处于XML文档的第一行。
3.不要在注释中使用双中画线(--)。
vi、W3C对于属性的使用建议:属性通常提供属于数据组成部分的信息,如果属性值里包含的信息属于该实体本身,则应该使用子元素来指定该信息,因此,W3C推荐尽量使用子元素,而避免使用属性。
vii、换行处理
目前主流的操作系统,主要有3种换行符:
1.Windows平台:回车符(CR)和换行符(LF)的组合存储换行。
2.UNIX和Linux平台:以换行符(LF)存储换行。
3.Macintosh平台:以回车符(CR)存储换行XML统一换行符(LF)存储换行。
viii、XML文档分类
1.格式不良好的XML文档
- 完全没有遵守XML文档基本规则的XML文档。
2.格式良好但无效的XML文档
- 遵守了XML文档基本规则,但没有使用DTD或Schema定义语义约束的XML文档。
- 使用DTD或Schema定义了语义约束,但没有遵守DTD或Schema所定义的语义约束的XML文档。
3.有效的XML文档
- 遵守了XML文档基本规则,并使用DTD或Schema定义了语义约束,而且也完全遵守了DTD或Schema所定义的语义 约束的XML文档。
- XML命名空间
i、为什么使用命名空间?
- 在同一份XML文档中可能出现多个同名的元素和属性一—这多个同名的元素和属性具有不同的含义和作用,但如果我们不从语法上提供区别,则XML处理器无法区分它们。
ii、使用命名空间
语法:xmlns[:prefix]=“命名空间字符串”。(xmlns是XML Namespaces的缩写)
命名空间的特征:
- 名字很长(命名空间往往是一个绝对的URL地址)。
- 名字里往往包含英文冒号、斜线等特殊字符。
iii、属性使用命名空间
- 通常情况下,由于属性是属于某个元素的,因此很自然地认为属性总是属于它所在元素所处的命名空间,一般无须专门为属性指定命名空间。
- XPath 语言
i、XPath 概念
- XPath语言是一门专门用于在XML文档中查找信息的语言,其他XML程序可利用XPath在XML文档中对元素和属性进行导航。
提问:为什么要查找标签和属性呢?
回答:因为XML文档是用来存储数据的,需要将数据提取出来使用,所以通过查找标签和属性进一步获取数据。
ii、XPath 节点
iii、XPath基本概念
iv、节点关系
>父节点
>子节点
>兄弟节点
>祖先节点
>后代节点
v、相对路径和绝对路径
- XPath基础语法
- XPath运算符
- 节点相关的常见函数
- DOM、SAX和JAXP解析
- JAXP的SAX支持
Ps:一般只用第二组API方法,因为比第一组方便。
- 应用之【SAX解析XML文档】
package com.muke.sax; import java.io.IOException; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.SAXException; import com.muke.sax.handler.MuKeHandler; public class SAXParse { public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException { //创建SAX解析器工厂 SAXParserFactory factory= SAXParserFactory.newInstance(); //创建SAX解析器 SAXParser parser= factory.newSAXParser(); //开始解析XML文档 parser.parse("D://firstxml.xml", new MuKeHandler()); } }
package com.muke.sax.handler; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; public class MuKeHandler extends DefaultHandler { //定义一个变量来保存当前正在处理的tag private String currentTag; //每当处理文本数据时将触发该方法 @Override public void characters(char[] ch, int start, int length) throws SAXException { String content=new String(ch,start,length); if (content.trim().length()>0) { System.out.println("<"+currentTag+">元素的值是:"+content.trim()); } } //解析文档结束时触发该方法 @Override public void endDocument() throws SAXException { System.out.println("解析文档结束"); } //解析元素结束时触发该方法 @Override public void endElement(String uri, String localName, String qName) throws SAXException { System.out.println("处理元素结束:"+qName); } //每当解析文档开始时触发该方法 @Override public void startDocument() throws SAXException { System.out.println("解析文档开始"); } @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { System.out.println("开始处理元素:"+qName); currentTag=qName; if (attributes.getLength()>0) { System.out.println("<"+currentTag+">元素的属性如下:"); for (int i = 0; i < attributes.getLength(); i++) { System.out.println(attributes.getQName(i)+"--->"+attributes.getValue(i)); } } } }
File: <?xml version="1.0" encoding="utf-8"?> <书籍列表> <计算机书籍> <书名>Java思想</书名> <作者>小王</作者> <价格>79.00</价格> </计算机书籍> <计算机书籍> <书名>Sprint指南</书名> <作者>小李</作者> <价格>89.00</价格> </计算机书籍> </书籍列表>
Console: 解析文档开始 开始处理元素:书籍列表 开始处理元素:计算机书籍 开始处理元素:书名 <书名>元素的值是::Java思想 处理元素结束:书名 开始处理元素:作者 <作者>元素的值是:小王 处理元素结束:作者 开始处理元素:价格 <价格>元素的值是:79.00 处理元素结束:价格 处理元素结束:计算机书籍 开始处理元素:计算机书籍 开始处理元素:书名 <书名>元素的值是:Sprint指南 处理元素结束:书名 开始处理元素:作者 <作者>元素的值是:小李 处理元素结束:作者 开始处理元素:价格 <价格>元素的值是:89.00 处理元素结束:价格 处理元素结束:计算机书籍 处理元素结束:书籍列表 解析文档结束
- 应用之【SAX生成XML文档】
package com.muke.sax; import java.io.File; import javax.xml.transform.OutputKeys; import javax.xml.transform.Result; import javax.xml.transform.Transformer; import javax.xml.transform.sax.SAXTransformerFactory; import javax.xml.transform.sax.TransformerHandler; import javax.xml.transform.stream.StreamResult; import org.xml.sax.helpers.AttributesImpl; public class BuildXMLMain { public static void main(String[] args) throws Exception { //创建保存XML的结果流对象 Result resultXML=new StreamResult(new File("D://firstxml1.xml")); //获取sax生成工厂实例 SAXTransformerFactory saxTransformerFactory=(SAXTransformerFactory) SAXTransformerFactory.newInstance(); //获取SAX生成处理者对象实例 TransformerHandler transformerHandler=saxTransformerFactory.newTransformerHandler(); transformerHandler.setResult(resultXML); //获取SAX生成器 Transformer transformer=transformerHandler.getTransformer(); transformer.setOutputProperty(OutputKeys.INDENT, "yes"); // 允许有空格 //生成文档的开始 transformerHandler.startDocument(); AttributesImpl attrImpl=new AttributesImpl(); // 设置属性 transformerHandler.startElement("", "", "书籍列表", attrImpl); //第一本书 transformerHandler.startElement("", "", "计算机书籍", attrImpl); transformerHandler.startElement("", "", "书名", attrImpl); transformerHandler.characters("Java思想".toCharArray(), 0, "Java思想".length()); transformerHandler.endElement("", "", "书名"); transformerHandler.startElement("", "", "作者", attrImpl); transformerHandler.characters("小王".toCharArray(), 0, "小王".length()); transformerHandler.endElement("", "", "作者"); transformerHandler.startElement("", "", "价格", attrImpl); transformerHandler.characters("79.00".toCharArray(), 0, "79.00".length()); transformerHandler.endElement("", "", "价格"); transformerHandler.endElement("", "", "计算机书籍"); //第二本书 transformerHandler.startElement("", "", "计算机书籍", attrImpl); transformerHandler.startElement("", "", "书名", attrImpl); transformerHandler.characters("Spring指南".toCharArray(), 0, "Spring指南".length()); transformerHandler.endElement("", "", "书名"); transformerHandler.startElement("", "", "作者", attrImpl); transformerHandler.characters("小李".toCharArray(), 0, "小李".length()); transformerHandler.endElement("", "", "作者"); transformerHandler.startElement("", "", "价格", attrImpl); transformerHandler.characters("89.00".toCharArray(), 0, "89.00".length()); transformerHandler.endElement("", "", "价格"); transformerHandler.endElement("", "", "计算机书籍"); transformerHandler.endElement("", "", "书籍列表"); //生成文档的结束 transformerHandler.endDocument(); System.out.println("XML文档生成成功!"); } }
Console: XML文档生成成功!
File: <?xml version="1.0" encoding="UTF-8"?><书籍列表><计算机书籍><书名>Java思想</书名><作者>小王</作者><价格>79.00</价格></计算机书籍><计算机书籍><书名>Spring指南</书名><作者>小李</作者><价格>89.00</价格></计算机书籍></书籍列表>
- XML文件解析 parse 方法详解
- 待更新...
XML - 基础篇
于 2018-10-10 14:38:53 首次发布