JavaWeb基础—XML学习小结
一、概述
是什么? 指可扩展标记语言
能干什么? 传输和存储数据
怎么干? 需要自行定义标签。
XML 独立于硬件、软件以及应用程序
通常。建立完xml文件后首要的任务是:引入约束文件!
二、XML简介:可扩展标记语言,都是标记语言,通过标签来操作
具有拓展性,标签为预定义,用户自定义标签(包括自己定义中文标签)
HTML:显示数据。
XML: 存储数据。(小型数据库)
两个版本:1.0(主流) 1.1(兼容性差)
用途:1.不同系统之间数据的传输(qq发送数据为例)
2.表示生活中有关系的数据
3.经常用在配置文件
三、XML的语法:
1.文档声明
<?xml version="1.0" encoding="gbk"?>
注意格式与位置(必须第一行第一列)
xmlns表示xml namespace
中文乱码问题的解决:一般系统默认的编码方式为gbk,打开时使用另外的编码方式
故出现乱码现象。解决方式是设置保存时候编码与打开方式编码相同:另存为时设置
编码方式。
2.元素的定义
A.有开始必须要有结束,必须成对出现。<person></person>
【成对】在 XML 中,省略关闭标签是非法的。所有元素都必须有关闭标签
标签没有内容,可以在标签内结束。<mytag/>
可以合理嵌套
只有一个根标签,其它都是子标签或是孙标签等。
B.空格和换行都会当成原始内容处理
<person>
人 <person>人</person> 两种是不同的
</person>
C。命名规范:区分大小写(HTML不区分)
不能以数字和_开头
不能以xml XML等开头
不能包含空格
不能包含冒号:
D.属性:一个标签可以有多个属性,但不能有相同的属性
E.注释:同HTML <!-- -->,注释不允许嵌套。快捷键Ctrl shift /
3.特殊字符
如 < < > > " " ' &apos & &类同HTML
4.CDATA区:解决多个字符都需要转义的操作
写法:<![CDATA[内容]]>
5.PI指令(处理指令)
对XML样式的设置,引入CSS样式等。但只能设置英文标签的样式
6.XML约束:
dtd约束(以看懂为准)
创建.dtd文件约束,看xml中有几个元素,就在dtd中写几个<!ELEMENT>
再判断是简单元素或者复杂元素(有无子元素等);复杂元素则表示为<!ELEMENT 元素名称(子元素)>
如<!ELEMENT person(name,age)>:简单元素则表示为<!ELEMENT 元素名称(#PCDATA)>
再引入dtd文件:<!DOCTYPE 根元素名称 SYSTEM "dtd文件路径">
另一书根元素名称通常记录为dtd文件名称
dtd三种引入方法:1.见上。文件引入
2.使用内部dtd <!DOCTYPE 根元素名称 []>
<!DOCTYPE note [
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
]>
3.使用外部dtd (网络上的dtd)
<!DOCTYPE 根元素名称 PUBLIC "DTD名称" "DTD文档的URL"> (struts2框架应用)
下载一个dtd文件后,复制第一行到xml文件即为成功引入,这里给出第一个接触用法的例子
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
使用dtd定义元素:<!ELEMENT 元素 约束>
简单元素约束举例:<!ELEMENT name (#PCDATA)> 约束为字符串
EMPTY 约束元素为空
ANY 任意
复杂元素约束举例:<!ELEMENT person (name,age)>
name+:表示可以出现一次或者多次
name?:表示出现0次或者1次
name*:表示任意次数
,表示出现的顺序,
name|age表示只能出现其中一个,或的关系
使用dtd定义属性:<!ATTLIST 元素名称
属性名称 属性类型 属性约束
>
属性类型一共三种 属性约束分类
CDATA 字符串 #REQUIRED 必须出现的
ENUM 枚举类型(aa|bb) #IMPLIED 可有可无
ID类型 字母或者_开头 #FIXED "AA" 固定值,如AA
直接值(没写则按照这个值)
定义实体 <!ENTITY copyright "版权所有"> 引用 ©right 一般写在内部dtd中
W3C案例
schema约束
schema符合XML语法,不能像dtd一样语法自成一派。
可以有多个schema,而dtd只能有一个。使用名称空间进行区分(类似包名进行区分)
可以支持更多的数据类型(不止字符串#PCDATA类型)
更复杂,约束更强大。
创建一个schema文件 .xsd
先看有多少个元素,就有多少个<element> 根元素 <schema></schema>
w3c预定义了属性和标签 xmlns=""表明是一个约束文件 targetNamespace="url"可以通过这个地址进行引入
看是简单或者复杂元素。
复杂元素:<complexType>
<sequence>
子元素(就是下面的简单元素内容
</sequence>
</complexType>
除了sequence 还可以有其它的:
<all></all> 表示元素只能出现一次
<choice></choice> 只能出现一个
maxOccurs="unbounded" 元素出现次数无限制
<any></any> 任意
简单元素:<element name="name" type="string"></element>
<element name="age" type="int"></element>
在XML中引入schema文件,在xml根元素上面,<person xmlns="在schema的xmlns后加-instance"
定义属性(必须是复杂元素)写在</complexType>之前
<attribute name="id1" type="int" use="required"></attribute>
四、XML解析方式【重点】
js中的DOM解析方式为根据层级结构分配树形结构,标签、属性、文本都封装成对象
XML解析方式:DOM和SAX
DOM:类同上述;树形结构容易完成增删改操作,但同时文件过大容易造成内存溢出
SAX:采用事件驱动,边读边解析。解析到一个对象则返回该对象名称。
容易查询,但不易于增删改操作
XML的解析器:不同公司提供了针对的解析器,以API文档形式给出。
jaxp【sun公司提供】
dom4j【实际开发使用最多】(XPath)
jdom
jaxp的API,属于SE部分,能在JDK中查到,javax.xml. parsers(解析)包
主要包含以下类(操作会出现格式混乱的问题:
dom:DocumentBuilder 解析器的类,抽象类(不能new)
DocumentBuilderFactory.newDocumentBuilder()方法获得
parse(string url)解析出整个文档document接口(父接口为Node)子接口中找不到方法时找父接口
DocumentBuilderFactory 解析器的工厂
newInstance();获取
查询操作:
得到工厂-》得到解析器-》得到Document-》document.getElementsByTagName()得到Nodelist,遍历等。
getTextContent()得到具体值
添加操作:
得到Document及之前操作同上,创建需要添加的元素,类同js。得到父元素(拿到第一个.item(0))
再进行操作,但此时操作的是内存里面的文档,最后要加一步回写。
通过TransformerFactory 和Transformer(得到方法同上)
再通过.transform(new DOMSource(document),new StreamResult("url"));方法回写
修改使用setTextContent()方法;其它类同上。
注意getElementsByTayName得到的是集合,要访问带.item(0)方法
同样的删除操作使用父节点进行删除。
采用递归进行遍历:访问自己。访问子节点。递归调用。
判断元素类型再进行打印。
sax:SAXParser 解析器类
SAXParserFactory 解析器的工厂
得到SAXParser实例类同上,使用的方法:parse(File,DefauleHander);
参数一为xml的路径,参数二为事件处理器(自动执行这个事件)
三个主要方法:startElement() :遇到开始标签自动执行此方法<start>
endElement() :遇到结束时自动执行</start>
characters():遇到文本时执行此方法 开始文本
qName:把标签名返回
使用dom4j解析XML,提供了解析器dom4j,由于dom4j是另外的组织开发的,不属于se的一部分。
默认情况下dom4j是不支持XPATH的,第一步需要引入jar包:dom4j下lib/jaxen
dom4j下提供两个方法支持XPATH,在document里调用
selectNodes("xpath表达式");返回Node,强转成element
selectSingleNode("xpath表达式");
所以第一步当然是导包。创建一个folder,复制jar包,点击jar包右键build path>add to path>变成奶瓶的样子
一般找docs就先看index.html,
得到document的方法:
SAXReader reader = new SAXReader();
Document document = reader.read(url);
document里面的方法:getRootElement();返回Element,也是接口(Node子接口)
Element里面的方法:getParent():得到父节点 addElement():添加标签
使用dom4j进行查询操作【XPath更方便】(增删改查操作)getText setText
创建解析器SAXReader,read()方法得到document,
得到根节点,getRootElement()
得到一层层的标签直到需要的标签(从上到下解析)
注意返回值,Element 与List<Element>
element(qname)得到标签下面第一个name子标签
elements()获取标签下面的一层子标签
elements(qname)所有一层子标签
使用dom4j进行元素末尾的添加操作(注意回写操作)
得到根节点之前同上。
得到P1,直接添加元素(不需要像前面一样先创建)
Element sex1 = p1.addElement("sex"); sex1.setText("nv");
使用这个类进行回写XMLWriter xmlWriter = new XMLWriter(OutputStream out, OutputFormat format)
一个是输出流 new FileOutputStream(xml路径),一个是格式
OutputFormat format = OutputFormat.createPrettyPrint();(是静态方法,直接类名调用,漂亮的格式,即有缩进的)
最后加一个回写回去,xmlWriter.write(document);
当然,流打开那必须关闭,xmlWriter.close();
在特定位置添加元素,应该在上一级用Elements返回list,
在list中使用list.add(index,element);需要创建一个用于添加
使用documentHelper帮助类,使用createElement()静态方法 documentHelper.createElement();
将部分代码封装到一个Utils类,封装成相关方法,常量如路径,
表示成public static final String PATH = "";
使用dom4j进行修改操作(重复部分使用封装的方法(得到Document)与回写与常量(路径等)等)
得到需要的标签后,setText()即可。
使用dom4j进行删除节点的操作,同样需要使用父节点进行删除,(可以使用getParent()方法获取父节点)
方法与Js稍有区别,remove()进行删除
【!】attributeValue()方法,得到属性值
使用dom4j支持XPath的操作,可以直接获取到某一个元素,而不用一层一层解析,
这里的XPath就类似于一种写法,一种表达式。详见手册前六实例。
/AAA/DDD/BBB一个/表示一层一层
//BBB每一层的BBB,不管哪一层都可以,只要名字相同
/AAA/BBB/*表示BBB下所有的
/AAA/BBB[1] 第一个BBB /AAA/BBB[last()] 最后一个BBB
//BBB[@id] 选择有id属性的所有BBB元素
//BBB[@id='b1'] 选择id属性为指定值的所有BBB
JavaWeb基础—XML学习小结的更多相关文章
- JavaWeb基础—JS学习小结
JavaScript是一种运行在浏览器中的解释型的编程语言 推荐:菜鸟教程一.简介js:javascript是基于对象[哪些基本对象呢]和和事件驱动[哪些主要事件呢]的语言,应用在客户端(注意与面向对 ...
- JavaWeb基础—CSS学习小结
重点记忆:四种结合方式 三种基本选择器 1.CSS:层叠样式表 相当于皮肤 提高了可维护性.样式与内容分离(注释格式/* */) 2.CSS与HTML结合的四种方式:内联式.嵌入式.外部式 1.每个 ...
- objective-c基础教程——学习小结
objective-c基础教程——学习小结 提纲: 简介 与C语言相比要注意的地方 objective-c高级特性 开发工具介绍(cocoa 工具包的功能,框架,源文件组织:XCode使用介绍) ...
- JavaWeb基础: XML基础知识
简介 XML:可扩展标记语言,W3C指定的用于描述结构化数据的语言,XML在实际开发中,经常用作软件的配置文件,以描述程序模块之间的依赖和组合关系. XML约束:XML常常用于软件配置管理,对于软件框 ...
- Hibernate入门篇<1>hibernate.cfg.xml学习小结
Hibernate配置文件主要用于配置数据库连接和Hibernate运行时所需的各种属性,这个配置文件应该位于应用程序或Web程序的类文件夹 classes中.Hibernate配置文件支持两种形式, ...
- JavaWeb基础—MySQL入门小结
一.数据库概述 RDBMS:关系型数据库管理系统 == 管理员(manager)+仓库(database) 常见数据库: Oracle(神喻):甲骨文 MySQL: 归于甲骨文旗下(高版本系统已经开 ...
- 题解 P3870 【[TJOI2009]开关】/基础分块学习小结
直接进入正题: 分块: 分块分块,就是把一个长串东西,分为许多块,这样,我们就可以在操作一个区间的时候,对于在区间里面完整的块,直接操作块,不完整的直接操作即可,因为不完整,再加上一个块本身就不大,复 ...
- JavaWeb基础: 学习大纲
JavaWeb基础: Web应用和Web服务器 JavaWeb基础: Tomcat JavaWeb基础:HTTP协议和基于Restful的架构 JavaWeb基础: Web工程配置文件 JavaWeb ...
- 学习nodejs部分基础内容入门小结
Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境. Node.js 使用了一个事件驱动.非阻塞式 I/O 的模型,使其轻量又高效. Node.js 的包管理器 n ...
随机推荐
- Week5——applet
1.定义 applet是一种Java程序.它一般运行在支持Java的Web浏览器内.因为它有完整的Java API支持,所以applet是一个全功能的Java应用程序. 2.特点(不同于Java a ...
- Centos 安装Dokuwiki
一.前言 DokuWiki是一个开源wiki引擎程序,运行于PHP环境下.DokuWiki程序小巧而功能强大.灵活,适合中小团队和个人网站知识库的管理. 二.环境 在centos6 下安装apache ...
- 提示"Zend Optimizer not installed"卸载安装也不行,什么原因如何解决?
如题:Zend Optimizer not installed可能原因及解决方法 Optimizer, Zend 在配置php服务器的时候,所有的东西都安装好了,就是浏览一个要求zend的程序的时候, ...
- 由于使用JDBC ResultSet的滚动功能而导致的内存溢出
前天一去公司,老大说,服务器全挂了! 最后排查了半天,结论是内存溢出! 在WAS的DUMP日志中,看得我头晕眼花,终于找到了罪魁祸首,原来是有同事写代码的时候使用了可滚动的结果集导致内存溢出. 什么是 ...
- 写markdown用于Github上readme.md文件
Markdown 文档地址 http://pan.baidu.com/s/1o6nu9To Markdown还有一系列衍生版本,用于扩展Markdown的功能(如表格.脚注.内嵌HTML等等),这些功 ...
- [翻译] DBCamera 轻量级定制摄像头
DBCamera 轻量级定制摄像头 https://github.com/danielebogo/DBCamera DBCamera is a simple custom camera with AV ...
- AVAudioPlayer简易封装
AVAudioPlayer简易封装 [说明] AVAudioPlayer简易封装,仅仅支持播放,暂停,停止,暂停时候带有渐隐效果,自己用,没有参考价值. [源码] https://github.com ...
- 铁乐学python_Day38_多进程和multiprocess模块1
铁乐学python_Day38_多进程和multiprocess模块1 [进程] 运行中的程序就是一个进程. 所有的进程都是通过它的父进程来创建的. 因此,运行起来的python程序也是一个进程,那么 ...
- Hyper-v 中 CentOS 连接外网之有线网卡
一.打开虚拟机交换管理器,查看默认的虚拟交换机 如果不是内部网络,则需要新建一个虚拟交换机,新的交换机应该使用内部网络: 二.配置虚拟机使用的交换机.如果 “默认开关” 不是内部网络,需要使用自己新创 ...
- VRSProcess(一)
1.freopen( "CONOUT$","w",stdout);在操作系统中,命令行控制台(即键盘或者显示器)被视为一个文件,既然是文件,那么就有“文件名”. ...