什么是XML
可扩展标记语言(Extensible Markup Language),标准通用标记语言的子集,简称XML。是一种用于标记电子文件使其具有结构性的标记语言。
XML的特点
- XML与操作系统、编程语言的开发平台无关
- 规范统一,实现不同系统之间的数据交换
ps: XML技术应用广泛,最基本的如网站、应用程序的配置信息一般采用XML文件描述。现在XML常用与配置文件的使用。
XML文档结构
1 XML 的声明
<?xml version=”1.0” standalone=”yes” encoding=”UTF-8”>
这是一个XML处理指令。处理指令以 <? 开始,以 > 结束。<? 后的第一个单词是指令名,如xml, 代表XML声明。
version, standalone, encoding 是三个特性,特性是由等号分开的名称-数值对,等号左边是特性名称,等号右边是特性的值,用引号引起来。
几点解释:
version: 说明这个文档符合1.0规范
standalone: 说明文档在这一个文件里还是需要从外部导入, standalone 的值设为yes 说明所有的文档都在这一文件里完成
encoding: 指文档字符编码
2 XML 根元素定义
XML文档的树形结构要求必须有一个根元素。根元素的起始标记要放在所有其它元素起始标记之前,根元素的结束标记根放在其它所有元素的结束标记之后,如
<?xml version=”1.0” standalone=”yes” encoding=”UTF-8”?>
<Settings>
<Person>Zhang San</Person>
</Settings>
3 XML元素
元素的基本结构由 开始标记,数据内容,结束标记组成,如
<Person>
<Name>Zhang San</Name>
<Sex>Male</Sex>
</Person>
需要注意的是:
元素标记区分大小写,<Name> 与 <name>是两个不同的标记
结束标记必须有反斜杠,如 </Name>
XML元素标记命名规则如下:
- 名字中可以包含字母,数字及其它字母
- 名字不能以数字或下划线开头
- 名字不能用xml开头
- 名字中不能包含空格和冒号
4 XML中的注释
XML中注释如下:
<!-- this is comment -->
需要注意的是:
- 注释中不要出现“–”或“-”
- 注释不要放在标记中
- 注释不能嵌套
HTML和XML的区别
- 可扩展性方面:HTML不允许用户自行定义他们自己的标识或属性,而在XML中,用户能够根据需要自行定义新的标识及属性名,以便更好地从语义上修饰数据。 [6]
- 结构性方面:HTML不支持深层的结构描述,XML的文件结构嵌套可以复杂到任意程度,能表示面向对象的等级层次。 [6]
- 可校验性方面:HTML没有提供规范文件以支持应用软件对HTML文件进行结构校验,而XML文件可以包括一个语法描述,使应用程序可以对此文件进行结构校验。
特殊字符的处理
特殊字符 | 实体名称 |
---|---|
< | <; |
> | >; |
& | &; |
" | "; |
’ | &apos; |
规则
- 有XML声明语句
- 有且仅有一个根标签
- 标签大小写敏感
- 属性值用双引号包裹
- 标签成对/空标签关闭
- 元素正确嵌套
XML的解析方式有四种:
- DOM解析
- SAX解析
- DOM4J解析
- JDOM解析
ps:这里暂时只介绍DOM和DOM4J解析
DOM解析:
//1.解析器工厂
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
//2.解析器
DocumentBuilder builder = factory.newDocumentBuilder();
//3.DOM对象
Document document = builder.parse("phone.xml");
//4.操作DOM对象
//getElementsByTagName 获得指定标签名 标签信息
//getLength 标签长度
//item 第几个标签
//getAttribute 获得指定属性名的属性值
NodeList brand = document.getElementsByTagName("Brand");
for (int i = 0; i < brand.getLength(); i++) {
Element element = (Element) brand.item(i);
String name = element.getAttribute("name");
//遍历了子标签
NodeList type = element.getElementsByTagName("Type");
for (int j = 0; j < type.getLength(); j++) {
Element element2 = (Element) type.item(j);
String typeName = element2.getAttribute("name");
System.out.println(name + typeName);
}
}
这里只是获取节点信息,下面将介绍如何用DOM解析对XML进行增、删、改:
//1.解析器工厂
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
//2.解析器
DocumentBuilder builder = factory.newDocumentBuilder();
//3.DOM对象
Document document = builder.parse("src/cn/test4/phone.xml");
//4.操作DOM对象
//增加节点
Element brand = document.createElement("Brand");
brand.setAttribute("name","三星");
Element type = document.createElement("Type");
type.setAttribute("name","NoteX");
//建立父子关系
brand.appendChild(type);
//建议整个文档的关系
document.getElementsByTagName("PhoneInfo").item(0).appendChild(brand);
//修改节点
Element newBrand = (Element) document.getElementsByTagName("Brand").item(2);
newBrand.setAttribute("name","SAMSUNG");
Element newType = (Element) document.getElementsByTagName("Type").item(3);
newType.setAttribute("name","T110");
//删除节点
NodeList del = document.getElementsByTagName("Brand");
Element item = (Element) del.item(2);
item.getParentNode().removeChild(item);
//保存 设置格式
//DOM源
DOMSource domSource = new DOMSource(document);
//格式化工厂
TransformerFactory transformerFactory = TransformerFactory.newInstance();
//格式化器
Transformer transformer = transformerFactory.newTransformer();
//具体格式
transformer.setOutputProperty(OutputKeys.VERSION,"1.0");
transformer.setOutputProperty(OutputKeys.ENCODING,"UTF-8");
transformer.setOutputProperty(OutputKeys.INDENT,"yes");
transformer.setOutputProperty(OutputKeys.STANDALONE,"yes");
StreamResult result = new StreamResult(new FileOutputStream("src/cn/test4/DOM解析.xml"));
transformer.transform(domSource,result);
DOM4J解析:
使用DOM4J解析时,需要导入DOM4j的jar包,代码如下:
//1.SAXReader
SAXReader saxReader = new SAXReader();
//2.DOM对象
Document document = saxReader.read("src/cn/test5/phone.xml");
System.out.println("document.asXML() = " + document.asXML());
//3.根标签
Element rootElement = document.getRootElement();
//4.操作根标签
//增加
Element brand = rootElement.addElement("Brand");
brand.setAttributeValue("name","SAMSUNG");
Element type = rootElement.addElement("Type");
type.setAttributeValue("name","T111");
//修改
brand.setAttributeValue("name","三星");
type.setAttributeValue("name","666");
//删除
rootElement.remove(brand);
rootElement.remove(type);
//保存
//格式
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("UTF-8");
XMLWriter writer = new XMLWriter(new FileWriter("src/cn/test5/DOM4j解析.xml"), format);
writer.write(document);
writer.close();