Java EE -> Xml [QR]

大纲:

  1. XML解析
  • 引入
  • 重点
    • DOM解析
    • SAX解析
    • DOM解析 VS SAX解析
  1. xPath技术
  • 引入
  • xPath作用
  • dom4j中使用xPath技术
  • xPath语法
  1. XML约束
  • 引入
  • DTD
    • 导入DTD的方式
    • DTD语法
  • Schema
    • 名称空间

@XML解析

1) 引入

程序读取或操作xml文档,叫xml解析。

XML解析又分为两类,DOM解析与SAX解析。

  • 基于DOM解析原理的工具:

  • JAXP (Oracle-Sun公司官方)

  • JDOM工具(非官方)

  • Dom4J工具(非官方)(最常用,性能最好)
    三大框架(默认读取xml的工具就是Dom4j)

  • .......

  • 基于SAX解析原理的工具:

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

2) 重点

1 DOM解析
- 原理:

xml解析器一次性把整个xml文档加载进内存,然后在内存中构建一颗Document的对象树,通过Document对象,得到树上的节点对象,通过节点对象访问(操作)到xml文档的内容。

- Dom4j解析工具
  • 读入xml文档的方法
  • 读取xml文档:
  Document doc = new SAXReader().read("xml文件");
  • 读取节点:
    nodeIterator(); 所有节点
  • 读取标签:
element("名称")   指定名称的第一个子标签对象
elementIterator("名称");  指定名称的所有子标签对象
elements();  所有子标签对象
  • 读取属性:
attributeValue(“名称”) 指定名称的属性值
attribute("名称")   指定名称的属性对象
getName()  属性名称
getValue()  属性值
atributeIterator()   所有属性对象(Iterator)
attributes()       所有属性对象(List)
  • 读取文本:
getText()  得到当前标签的文本
elementText("子标签名称")  得到子标签的文本
  • 修改xml文档的方法
  1. 写出内容到xml文档
XMLWriter writer = new XMLWriter(OutputStream, OutputForamt)
wirter.write(Document);
  1. 修改xml文档的API
  • 增加:
DocumentHelper.createDocument()  增加文档
addElement("名称")  增加标签
addAttribute("名称",“值”)  增加属性
  • 修改:
Attribute.setValue("值")  修改属性值
Element.addAtribute("同名的属性名","值")  修改同名的属性值
Element.setText("内容")  修改文本内容
  • 删除
Element.detach();  删除标签  
Attribute.detach();  删除属性
2 SAX解析

SAX解析工具由Sun公司提供的,内置在jdk的org.xml.sax.*中。

核心的API:
  • SAXParser类: 用于读取和解析xml文件对象。
  • parse(File f, DefaultHandler dh)方法: 解析xml文件
    • 参数一: File:表示 读取的xml文件。
    • 参数二: DefaultHandler: SAX事件处理程序。
  • 创建SAXParser对象
    SAXParser parser = SAXParserFactory.newInstance().newSAXParser();

  • 调用parse方法
    parser.parse(new File("./src/contact.xml"), new MyDefaultHandler());
    //注:MyDefaultHandler类是DefaultHandler类的子类,由自己编写!

  • DefaultHandler

  • DefaultHandler类的API:

    • void startDocument() : 在读到文档开始时调用
    • void endDocument() :在读到文档结束时调用
    • void startElement(String uri, String localName, String qName, Attributes attributes) :读到开始标签时调用
    • void endElement(String uri, String localName, String qName) :读到结束标签时调用
    • void characters(char[] ch, int start, int length) : 读到文本内容时调用
3 DOM解析 VS SAX解析(*面试题)
方面 DOM解析 SAX解析
原理 一次性加载xml文档,不适合大容量的文件读取 加载一点,读取一点,处理一点。适合大容量文件的读取
读写 读写 只读
方向 任意读取任何位置的数据,甚至往回读 从上往下,按顺序读取,不能往回读
方式 面向对象的编程方法(Node、Element、Attribute), Java开发者编码比较简单 基于事件的编程方法 , java开发编码相对复杂

@xPath技术

)1 引入

问题:当使用dom4j查询比较深的层次结构的节点(标签,属性,文本),比较麻烦!

)2 xPath作用

主要是用于快速获取所需的节点对象。

)3 Dom4j中使用xPath技术

  1. 导入xPath支持jar包 。 jaxen-1.1-beta-6.jar
  2. 使用xpath方法
List<Node>  selectNodes("xpath表达式");   查询多个节点对象
Node   selectSingleNode("xpath表达式");  查询一个节点对象

)4 xPath语法

符号 意义 作用
/ 绝对路径 表示从xml的根位置开始或子元素(一个层次结构)
// 相对路径 表示不分任何层次结构的选择元素
* 通配符 表示匹配所有元素
[] 条件 表示选择什么条件下的元素
@ 属性 表示选择属性节点
and 关系 表示条件的与关系(等价于&&)
text() 文本 表示选择文本内容

@XML约束

)1 引入

  • XML语法:

规范的xml文件的基本编写规则。(由w3c组织制定的)

  • XML约束:

规范XML文件数据内容格式的编写规则。(由开发者自行定义)

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

)2 DTD

导入DTD的方式
  • 内部导入
  <!ELEMENT note (to,from,heading,body)>
  <!ELEMENT to      (#PCDATA)>
  <!ELEMENT from    (#PCDATA)>
  <!ELEMENT heading (#PCDATA)>
  <!ELEMENT body    (#PCDATA)>
]>
  • 外部导入
  •     本地文件系统:    
    

<!DOCTYPE note SYSTEM "note.dtd">

  • 公共的外部导入:
    <!DOCTYPE 根元素 PUBLIC "http://gz.itcast.cn/itcast.dtd">
DTD语法
约束标签:

<!ELEMENT 元素名称 类别 或 <!ELEMENT 元素名称 (元素内容)>

  • 类别:

  • 空标签: EMPTY。 表示元素一定是空元素。

  • 普通字符串: (#PCDATA)。表示元素的内容一定是普通字符串(不能含有子标签)。

  • 任何内容: ANY。表示元素的内容可以是任意内容(包括子标签)

  • (元素内容)顺序问题:
    <!ELEMENT 元素名称 (子元素名称 1,子元素名称 2,.....)>: 按顺序出现子标签

  • 次数问题:

标签 次数
必须且只出现1次
+ 至少出现1次
* 0或n次
0 或1次
约束属性:

<!ATTLIST 元素名称 属性名称 属性类型 默认值>

  • 默认值:

  • #REQUIRED 属性值是必需的

  • #IMPLIED 属性不是必需的

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

  • 属性类型:

属性类型 表示
CDATA 表示普通字符串
(en1|en2|..) 表示一定是任选其中的一个值
ID 表示在一个xml文档中该属性值必须唯一,值不能以数字开头

)3 Schema

名称空间:

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

  1. 一个名称空间受到schema文档约束的情况
  2. 多个名称空间受到多个schema文档约束的情况
  3. 默认名称空间的情况
  4. 没有名称空间的情况

By : vpt
Ps : 此文基于黑马培训笔记,用于之后回顾知识点以markdown形式整理而成。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容

  • 1. XML总结 1.1. XML简介 XML : 可扩展的标记语言。(和HTML非常类似的) 可扩展的。 自定义...
    Ethan_Walker阅读 2,939评论 0 12
  • 1. XML简介 以下内容来自于http://www.w3school.com.cn/xml 基本知识 XML 和...
    WebSSO阅读 1,867评论 1 7
  • 经过两天的奋战,终于把xml简略的过了一遍。 1.1XML介绍 xml是Extensible Markup lan...
    Ystrator阅读 788评论 0 2
  • 肱二头肌 肱二头肌影响了三个关节:盂肱关节、肱尺关节和桡尺近侧关节 旋后=旋外 旋前=旋内 旋内和旋外主要是指的肩...
    厚_德_载_物阅读 679评论 0 4
  • 户外运动 我说说一些自己平时徒步、爬山时会带的一些东西。 背包,选择一款舒服的登山包可以减少负重,这款我最近入手的...
    木栗子阅读 360评论 0 0