XML学习笔记
MiTooHi 人气:2xml
简介
- xml是一种可扩展标记语言,全称是extensible markup language;
- 形式非常灵活,没有固定的标签,所有标签都可以自定义
- 通常被用于信息的记录和传递,是一个文本文件
xml与html的区别,xml被设计来格式化地存储和传输数据,而html被设计来表现数据,注重数据的外在形式
用途
- 通过几行JavaScript代码就可以从xml中读取数据并将数据实时更新到html中,而不需要对html做出修改;
- 简化数据的存储和传输,独立于软硬件,使用纯文本地形式存储数据,并且跨系统传输也能正确解析;
跨平台,不论本平台升级后使用原平台数据还是在其他平台使用,数据都可以直接访问;
基本语法结构
结构
xml是树形结构,从树根扩展到枝叶
基本语法1
- 文件扩展名是.xml
- 需要有一个声明信息
<?xml version="1.0" encoding="utf-8"?>
- 需要有且仅有一个根标签:
<book>其他标签</book>
(也叫做一个元素) - 标签都是成对出现的,只能一个嵌套一个(这与html有点不一样);
- xml大小写敏感要注意区分(开启标签和结束标签都必须使用相同的大写或者小写);
尽量有注释
<!--注释内容-->
一个完整的xml文件
<?xml version="1.0" encoding="utf-8"?>
<!--some description-->
<books>
<book id="01">
<name>xml教程</name>
<author>张三</author>
<price>50.5</price>
</book>
<book id="02">
<name>HTML教程</name>
<author>李四</author>
<price>40.9</price>
</book>
</books>
从上面的xml文件可以看出所有的标签都是我们为了实际需求自定义的(当使用utf-8来编码时甚至可以将标签定义为中文的),但是全部都遵从成对出现和嵌套的原则,双击文件默认使用浏览器打开。
基本语法2
- 属性值必须加引号
<note date="28/03/2020"> content </note>
- 实体的引用:在xml中为了避免发生冲突,有一些符号只能采用引用的形式来使用
| 引用 | 符号 |
| ----- | ---- |
| < | < |
| > | > |
| & | & |
| &apos | ' |
| " | '' | - HTML中的多个空格会被合并成一个,而在XML中空格会被全数保留
换行通常会被以字符的方式存储起来,Windows中的回车存储为CR换行存储为为LF,Linux和Mac OSX中的换行存储为LF,XML中的换行也被存储为LF
XML中的元素及其命名规则
- 元素是指从开始标签到结束标签的部分,一个元素中(也就是两个标签中)可以包含另一个元素、文本、属性等;
元素名称不能以数字或者标点符号开头,不能以XML开头(大小写都不行),不能有空格
当在一个XML文件中添加新的元素时并不会影响原来元素的使用,也就是不用修改调用程序,这是XML的可扩展性。
XML元素的属性
- 属性用来提供元素的额外信息:
<img type="gif">myPicture.gif</img>
这个gif的属性虽然对于数据本身没什么作用,但是对于处理数据的软件来说十分重要;- 注意:
属性名=属性值
要成对出现
- 注意:
- 属性中可以有特殊符号如
< > "
等; - 属性不方便扩展,一般不推荐使用,应该尽量将数据拆分为最小的元素来存储。
推荐使用属性的场合:需要区分元数据的时候,可以使用ID属性来将每一个数据区分开。(例如:
<books>
属性中的每一本<book>
可以用一个ID来标识<book id="1">
)XMLHttpRequest
XMLHttpRequest对象用在后台与服务器交换数据(例如注册用户时输入首字母后系统就将推荐的昵称发送给你),它还可以:- 不重新加载页面的情况下刷新网页
- 在页面加载后向服务器请求数据和接收数据
- 在后台向服务器发送数据
全面地学习这方面的知识推荐XML DOM教程
DTD
DTD可以定义合法的XML文档构建模块(也就是对输入的元素格式做出限定),它可以被成行地声明于XML文档中也可以作为一个外部引入。
DTD元素声明
- 包含在XML源文件中地DTD的声明:
<!DOCTYPE root-element [element-declarations]>
,例如:
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE note [ <!ELEMENT note (to,from,heading,body)> <!--规定了note中必须包含的四个元素,且他们只能按顺序出现--> <!ELEMENT to (#PCDATA)> <!--#PCDATA是只会被解析的字符数据或者文本--> <!--与PCDATA对应的还有CDATA,他不会被解析,会被当作标记对待,其中的文本也不会被展开--> <!ELEMENT from (#PCDATA)> <!ELEMENT heading (#PCDATA)> <!ELEMENT body (#PCDATA)> ]> <note> <to>Tove</to> <from>Jani</from> <heading>Reminder</heading> <body>Don't forget me this weekend</body> </note>
- 如果希望元素为空,用
EMPTY
来声明,如果希望可以包含任何可解析的数据的组合则用ANY
声明。 - 若希望某个元素至少出现一次则可以声明为
<!ELEMENT element-name (childname+)>
,若希望出现2次或多次则可以声明为<!ELEMENT element-name (childname*)>
,若希望出现零次或一次则可以声明为<!ELEMENT element-name (childname?)>
- 混合声明方式
<!ELEMENT note (#PCDATA|to|from|header|message)*>
标识note元素可以包含出现零次或多次的PCDADA、"note","from","header"或者"message". 外部的DTD文件的引入,只需在XML的声明下加一条
<!DOCTYPE root-element SYSTEM "filename.dtd">
即可,其中filename.dtd
就是外部的dtd文件,其后缀也可以不是dtd但是文件的写格式要正确。DTD属性声明
- 语法为:
<!ATTLIST element-name attribute-name attribute-type attribute-value>
其中属性类型和属性值参考链接 DTD的元素和属性分别是对应XML中的元素和属性
DTD实体
- 实体可以在内部或者外部声明,实体可以被引用
- 内部定义:
<!ENTITY entity-name "entity-valua">
外部定义:
<!ENTITY entity-name SYSTEM "URI/URL">
一句话:DTD就相当于一个模板, 他将XML中的元素的格式规范化。
XML的解析
- 官方提供的DOM解析,适用于解析次数较多的情形
- 民间的SAN解析,适用于数据量较大的情形
- dom4j是一个Java的XML解析接口,性能极好
JDOM开源的,比官方的DOM解析快
XML数据的读取与xml文件的创建(基于Java)
读取xml文件中的数据:下载dom4j的jar包,并将它加到项目的库里面
import java.io.File;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.io.SAXReader;
public GetXML{
public static void main(String[] args) throws Exception{
SAXReader reader = new SAXReader();
Document doc = reader.read(new File("filefolder/filename.xml"));
Element root = doc.getRootElement();
root.elementTterator();
Iterator<Element> it = root.elementIterator();
while(it.hasNext()){//从根出发遍历子元素
Element e = (Element) it.next();
Attribute id = e.attribute("id");
Element name = e.element("name");
Element course = e.element("course");
Element score = e.element("score");
System.out.println(name.getName()+"="+name.getStringValue);
System.out.println(course.getName()+"="+course.getText());
System.out.println(score.getName()+"="+score.getText());
}
}
}
- 创建xml文件:
package com.bjsxt.xml;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
public class CreatXml{
public static void main(String[] args){
Document doc = DocumentHelper.createDocument();
Element root = doc.addElement("books");//添加并得到一个根元素
Element book = root.addElement("book");
book.addAttribute("id","01");
/https://img.qb5200.com/download-x/doc.addElement("books").addElement("book").addAttribute("id","01");
Element name = book.addElement("name");
Element author = book.addElement("author");
Element price = book.addElement("price");
name.addText("java Edition 01");
author.addText("Peter");
price.addText("48");
//朴素的输出
//Writer writer = new FileWriter(new File("filename.xml"));
/https://img.qb5200.com/download-x/doc.write(writer);
//writer.close();
//以XML的格式输出
OutputFormat format = OutputFormat.createPrettyPrint();
XMLWriter writer = new XMLWriter(new FileWriter(new File("filename.xml")));
writer.write(doc);
writer.close();
}
}
一些相关资源
- XML的进阶学习
- 文档类型定义(DTD)规则详细学习
- 基于XML DTD的XML schema是DTD的产物,它与前者的作用一样
- 必须保证XML文档语法的正确性,推荐XML文档语法验证器
加载全部内容