1.xml介绍
XML 可以用于描述数据、存储数据、传输(交换)数据。也可用于配置文件。
- 写法格式:同 html 样式
- 仅关注数据本身
- 标记可扩展,可自定义
2.语法规范
(1)必须有 XML 文档声明:
<?xml version="1.0"?>
<?xml version="1.0" encoding="UTF-8"?>
<?xml version="1.0" standalone="yes"?>
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
- <?xml:文档声明的开始,表示当前是xml文档
- version:xml的版本,目前只有"1.0"
- encoding:编码
- standalone:xml文档是否独立,默认是yes
- ?>:xml文档声明结束
(2)必须有且仅有一个根元素
(3)严格区分大小写
(4)属性值用引号(双引号或单引号) :等号分开的名称-值对;在一个元素上,相同的属性只能出现一次
(5)标记成对
(6)空标记关闭
(7)元素正确嵌套
注意文本文件保存时候默认的编码格式是ANSI,需用记事本把它手动改为UTF-8保存。
3.元素命名规则
(1)名称中可以包含字母、数字或者其他可见字符;
(2)名称不能以数字开头;
(3)不能以 XML/xml/Xml…开头;
(4)名称中不能含空格;
(5)名称中不能含冒号(注:冒号留给命名空间使用)
4.实体
实体叫 ENTITY,实体的作用是避免重复输入。作用相当于宏或者变量。
(1)内置的 5 种实体
实体 符号
< <
> >
& &
" "
' '
(2)自定义实体
<!DOCTYPE 根元素[
<!ENTITY 实体名 "实体内容">
]>
使用已定义的实体:&实体名;
5.文档类型声明
文档类型定义——DOCTYPE,文档类型声明,紧跟 XML 声明之后,包含所有实体声明
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE 根元素标记名[
<!--实体声明-->
]>
6.组成
(1)所有的 XML 文档(以及 HTML 文档)均由以下简单的构建模块构成:
- 元素
- 属性
- 实体
- PCDATA
- CDATA
- CDATA 节(character data)
(2)CDATA
用于把整段文本解释为纯字符数据而不是标记的情况。如包含大量的<、>、&、或者"
字符。CDATA 节中的所有字符都会被当做元素字符数据的常量部分,而不是 XML 标记,
可以输入除]]>外任意字符,不能嵌套。
(3)PCDATA
PCDATA 的意思是被解析的字符数据(parsed character data)。
可把字符数据想象为 XML 元素的开始标签与结束标签之间的文本。
PCDATA 是会被解析器解析的文本。这些文本将被解析器检查实体以及标记。
文本中的标签会被当作标记来处理,而实体会被展开。
不过,被解析的字符数据不应当包含任何 &、< 或者 > 字符;需要使用 &、< 以及 >
的内置实体来分别替换它们。
7.XML 解析
(1)DOM 解析过程
- 如果一个程序需要进行 DOM 解析读取操作的话,也需要按照如下的步骤进行:
① 建 立 DocumentBuilderFactory : DocumentBuilderFactory factory =
DocumentBuilderFactory.newInstance();
②建立 DocumentBuilder: DocumentBuilder builder = factory.newDocumentBuilder();
③建立 Document : Document doc = builder.parse(“要解析的文件路径”);
④建立 NodeList : NodeList nl = doc.getElementsByTagName(“读取节点”);
⑤进行 XML 信息读取
- DOM 操作除了可以进行解析外,也可以进行文档的生成
如果想要生成 XML 文件,则在创建文档的时候,就应该使用 newDocument()方法
如果要将 DOM 的文档输出,本身是比较麻烦的 。一次编写多次 copy
public static void createXml() throws Exception{
//获取解析器工厂
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
//获取解析器
DocumentBuilder builder=factory.newDocumentBuilder();
//创建文档
Document doc=builder.newDocument();
//创建元素、设置关系
Element root=doc.createElement("people");
Element person=doc.createElement("person");
Element name=doc.createElement("name");
Element age=doc.createElement("age");
name.appendChild(doc.createTextNode("shsxt"));
age.appendChild(doc.createTextNode("10"));
doc.appendChild(root);
root.appendChild(person);
person.appendChild(name);
person.appendChild(age);
//写出去
// 获得变压器工厂
TransformerFactory tsf=TransformerFactory.newInstance();
Transformer ts=tsf.newTransformer();
//设置编码
ts.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
//创建带有DOM节点的新输入源,充当转换Source树的持有者
DOMSource source=new DOMSource(doc);
//充当转换结果的持有者
File file=new File("src/output.xml");
StreamResult result=new StreamResult(file);
ts.transform(source, result);
}
(2)SAX 解析
如果要想实现这种 SAX 解析,则肯定首先建立一个 SAX 的解析器
// 1、创建解析器工厂
SAXParserFactory factory = SAXParserFactory.newInstance();
// 2、获得解析器
SAXParser parser = factory.newSAXParser();
// SAX解析器 ,继承 DefaultHandler
String path = new File("resource/demo01.xml").getAbsolutePath();
// 解析
parser.parse(path, new MySaxHandler());
(3)DOM4j 解析
可以使用 DOM4J 进行 XML 文件的读、写操作
- 解析
File file = new File("resource/outputdom4j.xml");
SAXReader reader = new SAXReader();
// 读取文件作为文档
Document doc = reader.read(file);
// 获取文档的根元素
Element root = doc.getRootElement();
// 根据跟元素找到全部的子节点
Iterator<Element> iter = root.elementIterator();
while(iter.hasNext()){
Element name = iter.next();
System.out.println("value = " + name.getText());
}
- 创建
// 使用DocumentHelper来创建 Document对象
Document document = DocumentHelper.createDocument();
// 创建元素并设置关系
Element person = document.addElement("person");
Element name = person.addElement("name");
Element age = person.addElement("age");
// 设置文本
name.setText("shsxt");
age.setText("10");
// 创建格式化输出器
OutputFormat of = OutputFormat.createPrettyPrint();
of.setEncoding("utf-8");
// 输出到文件
File file = new File("resource/outputdom4j.xml");
XMLWriter writer = new XMLWriter(new FileOutputStream(new
File(file.getAbsolutePath())),of);
// 写出
writer.write(document);
writer.flush();
writer.close();