XML(一)

3 篇文章 0 订阅

xml : 当做配置文件

一:xml概念
二:xml的语法
三:xml的约束
四:xml的解析
五:xml的生成

1.xml历史:

1,1993年, HTML 超文本标记语言(HyperText Markup Language)特殊的文本随着万维网的推广,出现了HTML语言,用于万维网上的页面展示展示数据。

普通文件–>没有效果
超文本–>按照规矩写就会有特定的效果
<a>点击</a>
标记: 开始标记 :<>
结束标记 :</>
标签: 有名字的标记
<button>提交</button>

2,hmtl缺陷:

2.1,HTML语言的标记不能自定义,只能使用预定义。
例如:预定义 : w3c
a–> 下划线
   手
   改变颜色

2.2,所有html标记都是被预定义
2.3,HTML语言的标记本身不能用来描述数据,html用来显示数据

        <table>
		     <tr>
		     	<td>1</td>
		     	<td>tom</td>
		     	<td>10</td>
		     </tr>
		</table>
	
	<students>
	    <student>
	    	<id>1</id>
	    	<name>tom</name>
	    	<age>10</age>
	    </student>
	</students>

2.4,HTML语言的标记没有国际化(不同浏览器显示同一页面的效果可能不一样)

3,1998年 XML 可扩展的标记语言(Extensible Markup Language)

W3C组织在1998年推出了可扩展标记语言XML, XML语言的本身是用来替代HTML语言的,但实际上XML语言已经很难替代HTML语言了,因为HTML语言的使用在整个万维网上使用太广泛了。

xml具有的功能:

1,html展示数据功能,xml具备
2,html显示效果 ,xml具备
【保存数据,有结构的保存数据】

什么是 XML?

1,XML 指可扩展标记语言(EXtensible Markup Language)
2,XML 是一种标记语言,很类似 HTML
3,XML 的设计宗旨是保存,而非显示数据。
4,XML 保存数据,侧重的是【数据的内容】和【组织结构】。
5,XML 标签没有被预定义。您需要自行定义标签。
6,XML 被设计为具有自我描述性。
7,XML 实现了国际化 internationalization i18n

总结:有结构的保存数据–>很好的描述数据

为什么要用xml?
xml功能:
1,保存数据
2,描述数据

1.使用范围
0).临时保存:jvm关闭 数据释放
int a = 10;
int[] arr = {10,12,18,19,20};
List list;
持久化保存数据:
file 数据写到文件中
name=tom
ObjectOutputStream:对象输出流,序列化
但不利于修改

a).java中iO技术
因为文件中数据的结构不规范,解析的时候不统一。

序列化:对象写到文件
反序列化:把文件中的数据 写到代码中变成对象

b)用数据库 oracle,mysql
保存的大量数据,增、删、改、查
1一个学生信息:
name = tom
age = 10
id = 1
1,下载安装数据库
2,创建用户,创建数据库,
3,insert
4,update

c)xml:如果保存三个学生的信息,查询数据

【快速保存少量数据】

2.保存个性化的数据
有结构 可描述 数据
3.是一门跨平台、跨语言的一门技术
java跨 --> jvm --> window jdk
–> linux jdk
–> mac jdk

xml跨 : 平台+语言
xml文本文件

window : 记事本打开xml文件
linux : vi打开xml文件

语言:
读取文件

4.支持国际化I18n ( internationalization )
xml:可以被css进行渲染–>在浏览器显示好看的页面
语言国际化

项目中下面需求需要用到xml

第一个需求: 数据传输需要一定的格式
1.数据的可读性
2.将来的扩展
3.将来的维护

        <student>
	     	<name></name>
	     	<age></age>
	     </student>

xml:有结构的描述数据

XML现在已经是业内传输数据的标准,它和语言无关

第二个需求: 配置文件
mybatis spring springmvc
mybatis: 连接数据库,提供简化的操作,连接信息

第三个需求: 保存个性化数据,充当小型的数据库

保存数据一般是使用数据库保存,或者使用一般的文件保存,这个时候也可以选择XML文件,因为XML可以描述复杂的数据关系。从普通文件中读取数据的速度肯定是比从数据库中读取数据的速度快,只不过这样不是很安全而已

第四个需求: 跨平台,跨语言。

xml语法:

1,XML 文档必须有[根元素],并且只能有一个根元素。

根元素是一个完全包括文档中其他所有元素的元素。
根元素的[起始标记]要放在所有其他元素的起始标记之前。
根元素的结束标记要放在所有其他元素的[结束标记]之后。

2,所有 XML 元素都必须有开始标签和结束标签
有头有尾
开始标签 结束标签
<abc>   </abc>

<abc/>:在开始标签和结束标签中间没有任何东西

3,XML 标签对大小写敏感

<abc></abc>
    	<ABc></ABc>

4,XML 必须正确地嵌套
正确:

	     <a>
    		<b>
    			<c></c>
    		</b>
    	</a>

错误的嵌套:

        <b>
    		<a>
    			<c></c>
    		</b>
    	</a>

<a><b><c></c></b></a>

<a><c><b></c></b></a>

5,XML 的标签中属性值须加引号
属性:
1,写在开始标签中
2,属性值必须用"" ''包裹
3,多个属性用空格隔开
3.5,属性和标签名也需要用空格分开
4,属性名和属性值 使用=连接
昆山: attr: 百强县
<昆山 attr=“百强县”></昆山>

6,实体引用 ???

7,XML 中的 注释 <!-- 注释的内容–>
… html注释一样
选中 需要注释的内容 Ctrl+shift+/
取消: Ctrl+shift+\

8,在 XML 中,空格会被保留—> " "
对于XML标签中出现的所有空格和换行,XML解析程序都会当作标签内容进行处理。
例如:下面两段内容的意义是不一样的。
中间的
文本域:开始标签到结束标签中所有内容

<name>tom</name>
   <name>
    		tom
    	</name>

由于在XML中,空格和换行都作为原始内容被处理,所以,在编写XML文件时,要特别注意。
但是在一些封装好的解析方式中,是可以忽略掉这些空格和换行的.(例如在一些第三方提供的jar包中)

XML 元素组成:
XML 元素指的是从(且包括)
开始标签直到(且包括)
结束标签的部分。

1,开始标签中属性
2.字符数据:字符串和引用实体
3.空

<id></id>

4.子元素(子标签)
5.混合元素(字符数据+子元素)

语法规则
良构的xml:xml文件必须满足xml的语法规则
良构:良好的结构
1.指令:第一行必须写xml指令处理:

<?xml  ?>
		
<?xml version="1.0" encoding="UTF-8"?>

在指令处理中可以指定xml的版本号和编码格式
version:指定xml的版本
encoding:指定编码格式 GBK GB2312 ISO-8859-1
standalone="yes/no"代表该文件是否独立
2.所有的xml的有且仅有一个根元素 root
范围最广的标签

3.元素的使用规则
a.一个元素要包含开始标签和结束标签
b.属性要写在开始标签中
c.空元素 <name></name>或者<name/>
空元素:标签文本中没有任何数据

4.元素的嵌套规则:一个元素除了根元素外,要嵌套在另外一个元素的开始标签和结束标签之间。

<a><b><c><d></d></c></b></a> //正常
	<a><b><c><dd></a></b></c></dd>	  //error

5.标签命名规则
a.以字母或下划线开头,由数字、字母、连接符号(-)、下划线(_),点(.)组成
b.大小写敏感
c.标签名不能包含空格
空格 是 隔开 属性 和标签名
d.不能使用W3C的保留字

6.元素的属性规则
a.属性必须写在开始标签中
b.属性名和属性值要成对出现,一旦有属性,就必须给它属性值,
并且格式:
属性名=“属性值”
c.多个属性之间用空格进行分隔

符合以上六条规则,定义的xml文档就是一个"良构"的xml文件
良好的结构xml–>符合语法的xml

有效的xml = 良构 + dtd约束

xml注释

格式: <!-- 注释内容 -->
1,注释内容中不要出现 - -;
2,不要把注释放在标记中间;
<></>–>
<st<!-- 注释内容 -->udent> XXX
3,注释不能嵌套;
<!-- 注释 <!-- 注释内容 --> 内容 -->
4,可以在除标记以外的任何地方放注释

xml 实体 : 字符串变量

String msg = “字符串”;
xml : 实体 <==> 字符串
用于表示一些在xml中有特殊意义的字符串
xml
声明一个实体:

<!DOCTYPE 根标签[
		<!ENTITY 实体名 "">
	]>

定义实体 的 实例:

<!DOCTYPE students[
		<!ENTITY address "昆山巴城学院路828号">
	]>

等价于:
String address = “昆山巴城学院路828号”;

使用实体: &实体名;
&address;

把xml在浏览器中打开:
步骤:1,eclipse中打开xml
2,在当前文件中 alt+enter
3,复制location–>对应的值(F:\Briup\Briup_Work_space\hdjd\workspace\xml\src\com\briup\test2.xml)
4,打开浏览器
5,把复制的路径 粘贴到浏览器的地址栏 回车

实体:在xml中定义的变量
abc.xml
<?xml version="1.0" encoding="utf-8"?>

]>
实体的调用:&实体名;

默认实体都是在xml中有特殊含义的字符串

默认的实体:

Entity			Character

&lt;			<
&gt;			>
&quot;			"
&apos;			'
&amp;			&


注: DOCTYPE:关键字,一个xml文件只能有一个DOCTYPE

PCDATA,CDATA : 概念

PCDATA(Parsed Character Data):
定义内容模式的时候使用。可以被xml文档解析器解析的,但是有些字符需要借助实体才可以被解析器解析,可以被解析器所解析的字符数据

XML文件中的正常内容基本都是PCDATA
练习:在浏览器上输出<符号 &lt;
PCDATA (Parsed Character Data) 会被xml文档解析器解析的,但是有些特殊字符需要借助实体才可以被解析器解析。

CDATA:(Character Data):写在标签中
不被解析器所解析的字符数据,字符串原样输出
格式:<![CDATA[需要原样输出的字符串]]>

练习:浏览器中输出&lt;

<![CDATA[   &lt;  ]]>

处理指令:
xml也是可以被css渲染

处理指令,简称PI (processing instruction)。
处理指令用来指挥 [解析引擎] 如何解析XML文档内容。

例如,在XML文档中可以使用xml-stylesheet指令,通知XML解析引擎,使用css文件显示xml文档内容。

<?xml-stylesheet type="text/css" href="css文件路径"?>

处理指令必须以 <? 作为开头,以 ?> 作为结尾,XML文件的头部声明语句就是最常见的一种处理指令。
XML文件中可以有多个处理指令
例如: class.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
	<?xml-stylesheet href="class.css" type="text/css"?>
	<class>
		<student id="001">
				<name>张三</name>
				<age>20</age>
		</student>
		<student id="002">
				<name>李四</name>
				<age>20</age>
		</student>
	</class>

class.css文件:

name{
    		font-size:30px;
    		font-weight:bold;
    		color:red;
    	}
    	age{
    		font-size:30px;
    		font-weight:bold;
    		color:green;
    	}

DTD : 对xml约束的规则
1,约束元素
1.1:元素出现的个数
1.2:元素出现的频率
1.3:元素出现的顺序
2,约束属性
2.1,什么属性可以出现必须出现
2.2,属性的值 可能是什么 |
3,能否文本

就是一套关于元素、属性以及其他杂项在xml文档中使用规则的声明。

DTD:可以限定:标签,文本域,属性

DTD:Document Type Definition
1.定义一个xml文档的结构和顺序
2.用来限定验证xml文档的内容
3.【强制xml文档的内容是一个合法的文档】
4.可以包含在xml文档内部或者在一个独立的文件
5.DTD不描述允许出现在元素内部的数据
6.DTD不是基于xml的
7.可以被xml schema 覆盖
schema:也是一种xml约束

DTD的定义:描述元素、属性和其他杂项在xml文档中的使用规则的说明
DTD的分类:
1).外部的DTD:DTD和xml文档不在同一个文件中
2).内部的DTD:DTD和xml文档在同一个文件中
3).混合的DTD:既有外部DTD,又有内部DTD

DTD的目的:
验证该xml文档是否是有效的xml文档
如果一个良构的xml文档满足了DTD的声明就是一个有效的xml文档。
注意:良构 不一定 有效,但是有效一定良构

引入DTD:语法:
内部嵌套:
引入外部:

<student>
	//只能出现name标签
</student>

DTD在元素中的声明:

对元素限定:<!ELEMENT 元素名 内容模式>
对属性限定:<!ATTLIST 元素名 属性名 属性类型 属性默认值 属性名 属性类型 属性默认值>

	<!ELEMENT student (#PCDATA)>
	    :对student标签进行约束,student元素内容只能是字符或者为空
	<!ELEMENT student (name,age)>
	    :对student标签进行约束,student元素中子标签只能是 按顺序出现 name标签和 age标签
	
	约束标签:
	格式:<!ELEMENT  元素名 内容模式>

内容模式:
1). (#PCDATA):元素内容为字符或者为空
2). EMPTY:元素内容为空
3). ANY:元素内容为任意的,主要是使用在元素内容不确定的情况下对子标签进行约束
4). (Child Elements): , | + * ?
,:表示元素必须顺序出现
|:表示多个元素中选一个
元素名上无符号:表示元素必须要出现1次
量词
+:表示元素可以出现1次到多次
*:表示元素可以出现0次到多次
?:表示元素可以出现0次到1次
5).混合元素

eg:<!ELEMENT root (#PCDATA|name|age)*>
				<root>
					<name></name>
					<age></age>
				</root>

子元素可以是name,也可以是age,顺序没有关系,频率也没有关系
注意:浏览器是非验证的解析器,不会验证xml的有效性

属性的DTD声明:attribute
格式:<!ATTLIST 元素名 属性名 属性类型 属性默认值 ......... 属性名 属性类型 属性默认值 >
属性类型:
1). ID:属性值必须唯一,属性值必须满足命名规则 —> 属性默认值:1 2 可以使用
2). (枚举值1|枚举值2|枚举值3…):属性值必须在枚举值中 —> 属性默认值:1 2 3 4 可以使用 -->但是要注意:属性的默认值如果现在3 4 ,值就只能是枚举值123… 中出现
3). CDATA:属性值为字符 —> 属性默认值:1 2 3 4 可以使用.

属性默认值:
1). #REQUIRED 属性必须出现在元素的开始标签中。
<!ATTLIST b name ID #REQUIRED>
2). #IMPLIED 属性可以不出现,并且当它不出现的时候没有默认值
<!ATTLIST b address (city|number|all) #IMPLIED>
3). “字符串” 属性可以不出现,并且当它不出现的时候是有默认值的,而该属性的默认值就是该字符串
<!ATTLIST b add (city|number|all) 'city'>
4). #FIXED 属性可以不出现,但是如果出现的话必须是指定的属性值,不出现的话也是指定的默认值
<!ATTLIST c number CDATA #FIXED 'asdf'>

xml解析:

sax 和 dom

记住 : 背 : 初学阶段
面向对象编程:
解析xml

SAX解析:
特点:
基于事件处理机制的解析(sax)
(1)边读边解析
(2)不能回读,如果遇到未处理的事件,要重新读取
(3)轻量级,速度快
(4)适合处理较大的xml文档
(5)只能读取,不能修改
代码:
SAXParserFactory 创建SaxparserFacory工厂:这个工厂是用来产生SAXParser实例
SAXParser sax解析器
parse(File f, HandlerBase hb);
DefaultHandler 默认的处理类 需要写一个类继承它

默认处理类中常用方法:
1, startDocument(); 这个方法只是在解析xml的时候执行一次
2, endDocument(); 解析xml结束时调用,只调用一次
// 遇到开始标签调用该方法,调用n次
3, startElement(String uri, String localName, String qName,Attributes attributes)
uri:指向一个唯一的地址 一般不使用
localName 加上命名空间的名字,如果没有设置命名空间,值为null
qName:当前标签名
attributes:封装了开始标签中属性的信息
attributes.getQName(i);拿到第几个属性的属性名
attributes.getValue(i);拿到第几个属性的属性值
attributes.getLength();该标签属性的个数
4, endElement();遇到结束标签的时候调用
5, characters(char[] ch, int start, int length);遇到文本域的时候执行该方法

DOM解析:
特点:
基于树形结构的解析(dom)
(1)先将整个xml文档加载到内存,形成树形结构,再解析
(2)可以重复读取
(3)重量级,速度慢
(4)适合处理较小的xml文档
(5)能够进行增、删、改、查

代码:

		javax.xml.parsers.DocumentBuilderFactory;
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();// 获取dom解析器工厂

		javax.xml.parsers.DocumentBuilder;
		DocumentBuilder build= factory.newDocumentBuilder();//获取dom解析器

		org.w3c.dom.Document;
		Document doc = build.parse(new File("src/com/briup/xml/sax/Test.xml"));解析xml文件;
		
		org.w3c.dom.Element;
		Element root = doc.getDocumentElement();// 获取根节点
		NodeList list = root.getElementsByTagName("time"); 拿多个time(元素)节点 取文本 相加 完成
		Element e = (Element)list.item(i);//获取第i号位上的 标签
		e.getNodeName()//获取标签名
		e.getTextContent()//获取标签中所有的文本值,在该标签下其他标签中的文本也会获取到
		
		NamedNodeMap att = node.getAttributes();//获取这个节点的所有属性
		Node n1=att.item(i);
		n1.getNodeName();拿到属性名
		n1.getNodeValue();拿到属性值

		Node child = node.getFirstChild();拿到该标签的第一个孩子
		String nv = child.getNodeValue();成功获取文本值

DOM4J解析:

1,需要引入jar包 —> dom4j-16.1.jar
怎么引入jar包?
1.1首先需要有一个java program ,然后左键单击选中项目,右键new一个Folder取名为jar
1.2然后把想引入的jar包复制到刚才新建的folder下面
1.3选中想依赖到项目中的jar包,右键 选中build Path 然后点击 add to build Path
1.4 依赖完成 —>jar包已经添加到项目中

2,创建dom4j解析器对象 SAXReader s = new SAXReader();

3,使用解析器对象解析xml文件 Document doc = s.read(“文件路径+文件名”);//这个对象代表整个文档, 但是还不是文档是根节点

4,获取xml文档的根节点 Element root = doc.getRootElement();

5,获取根节点的所有孩子节点 List list = root.elements();

6,(可选)获取属性所对应的值 String attribute = item.getAttribute(“属性名”);

7,(可选)获取本节点下的孩子节点 List list2 = e1.elements();//就是本次把e1当做是根节点 然后获取根节点下面的子节点

8,(可选)获取当前标签的标签名 e1.getName();

9,(可选)获取当前标签的文本值 e1.getText();

10,(可选)获取当前标签下所有的文本值 e1.getStringValue();

dom 增删改查
对内存中的xml进行增删改查
dom–>

创建xml文件:

1.使用DOM方式创建students.xml
原则:就是使用Doc对象去创建各种Node,Attribute和createTextNode(),然后将节点append到相应的标签后面

DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document doc = builder.newDocument();//创建新doc对象
主要使用的方法:
Attr name =doc.createAttribute(“属性名”);
name.setValue(“属性值”);
标签.setAttributeNode(name);//给标签添加一个Attr对象

标签.setAttribute(“属性名”,“属性值”);//给标签设置一个属性 key=value

Element teacher=doc.createElement(“标签名”);//创建标签 现在只是单单创建了一个标签 没有追加到任何父标签后面
Text hao=doc.createTextNode(“文本值”);//创建文本 同上
父标签.appendChild(节点);//追加, 将文本或者标签追加到父标签下

将创建的xml写到文件中 需要导入包:crimson.jar
FileWriter fw = new FileWriter(“src/teacher.xml”);
((XmlDocument)doc).write(fw);

2.使用Writer的方式直接写出去一个xml文件
//1获得写出对象
XMLStreamWriter writer = XMLOutputFactory.newFactory().createXMLStreamWriter(new FileOutputStream(“src/aaa.xml”));
常用方法:
writer.writeStartDocument(“utf-8”, “1.0”);//写xml的指令
writer.writeEndDocument();//写结束指令
writer.writeStartElement(“students”);//写一个开始标签
writer.writeEndElement();//写一个结束标签
writer.writeAttribute(“one”, “这个是一个单独的子标签”);//写一个属性在上面的标签中
writer.writeCharacters(“文本 还是很好看的”);//写一个文本
删除xml文件的节点:
removeChild()
removeAttribute(String name)

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值