XML
XML:扩展标记语言,用来结构化、存储、传输数据
1. 区分大小写
2. 属性值必须封装在引号中
3. 属性必须有值
4. 必须有结束标记
XML的文档结构
1. 头标,XML声明:<?xml version="1.0" encoding="UTF-8"?>
-> 使文件符合xml标准规格,必须有
2. 文档类型的声明:<! DOCTYPE ....>
-> 确保文档的正确性,非必须有
4. 正文:<根元素><根元素/>
<? ?>:处理指令,用来给处理XML文件的应用程序提供信息<!-- -->:注释
实体引用
使用实体引用代替特殊字符,如: < 代替 <
或使用CDATA来显示特殊字符,CDATA中的文本不会被xml处理器解析:
<![CDATA[内容]]>
文档类型的定义 DTD
DTD包含了一些规则,通过设定文档的合法子元素和每个元素的属性,来说明文档应该如何构成。
这些规则包含在文档类型的声明的DOCTYPE声明中:
<! DOCTYPE 根元素 [DTD规则] > : DTD存放在xml文档中
<! DOCTYPE 根元素 SYSTEM “DTD文件/URL” > : DTD存放在外面,通过system声明来引入
命名空间
避免元素名冲突
使用URI来标识命名空间
在标签中使用xmlns属性定义命名空间和别名:
xmlns:别名=“命名空间URI”
理解:通过xmlns引入命名空间,并为其设置别名,通过别名:元素来使用命名空间中的元素。
示例1:
<h:table xmlns:h="http://www.w3.org/TR/html4/">
<h:tr>
<h:td>Apples</h:td>
<h:td>Bananas</h:td>
</h:tr>
</h:table>
h是别名,h:table是指使用的是命名空间“http://www.w3.org/TR/html4/”中的table元素。
示例2:
<configuration xmlns="http://www.test.com/1.html"
xmlns:si="http://www.test.com/2.html">
<size value="20" si:unit="mm"/>
</configuration>
这里有两个命名空间,子元素可以继承父元素的命名空间
,所以子元素size和父元素configuration都是URI http://www.test.com/1.html的命名空间的组成部分。
没有使用别名前缀的属性不能成为命名空间的组成部分
,所以属性si:unit是URI http://www.test.com/2.html的命名空间的组成部分,而属性value则不是任何的命名空间的组成部分。
DOM分析器处理命名空间:
getNodeName()/getTagName() → 返回带有别名前缀的权限定名【h:table】
getLocalName() → 返回本地名(不带有别名前缀)【table】
getNameSpaceURI() → 返回命名空间URI【http://www.test.com/1.html】
Java操作XML:读取、新增、修改XML中的数据
XML 解析详解 - 四种解析方式
XML 的解析方式分为四种:DOM 解析、SAX 解析、JDOM 解析、DOM4J 解析。
DOM分析器
文档对象模型分析器,将XML文档读入一个树状结构中。
Java 解析 XML 的四种方式
- 生成DocumentBuilderFactory对象:DocumentBuilderFactory.newInstance()
- 生成DocumentBuilder对象:factory.newDocumentBuilder()
- 生成Document对象:builder.parse(File)
→ 加载xml文件- 获取根节点:doc.getDocumentElement()
- 获取某节点的所有子节点:node.getChildNodes() → NodeList
- 遍历节点集合,获取集合中的节点:nodeList.item(index) → Node
- 获取某节点的上一个或下一个兄弟节点:node.getPreviousSibling()/getNextSibling()
- 获取节点的属性和值:node.getNodeName()/getNodeValue()
- 获取节点的文本数据:node.getData()
Document对象代表了XML文档在内存中的树状结构。
SAX分析器
基于XML的简单API分析器:读取XML文档时,负责生成相应的事件。
- 生成SAXParserFactory对象:SAXParserFactory.newInstance()
- 生成SAXParser对象:factory.newSAXParser()
- 处理xml文档:parser.parse(source,handler)
JDOM 解析
- 生成SAXBuilder对象:new SAXBuilder()
- 生成一个关联xml文档的输入流:
new InputStreamReader(new FileInputStream(File),“UTF-8”)- 生成Document对象(加载xml到SAXBuilder中):builder.build(isr) → Document
- 获取根节点:doc.getRootElement() → Element
- 获取根节点下的子节点,遍历:root.getChildren()
- 获取节点的所有属性,遍历:ele.getAttributes()
> 获取属性和值:attr.getName()/getValue()- 获取节点的文本数据:ele.getText()
DOM4J 解析
- 生成SAXReader对象:new SAXReader()
- 生成Document对象(加载xml文件):reader.read(File)
- 获取根节点:doc.getRootElement()
- 获取节点的迭代器,遍历:ele.elementIterator() → Iterator
- 获取节点的所有属性,遍历:ele.getAttributes()
> 获取属性和值:attr.getName()/getValue()- 获取节点的文本数据:ele.getText()
生成xml文档
用文档的内容建立一个DOM树,然后写出树的各个内容。
- 创建一个空文档:DocumentBuilder对象.newDocument() → Document
- 创建元素:doc.createElement(元素名)
- 创建文本节点:doc.createTextNode(文本内容)
- 将根节点添加给文档:doc.appendChild(root)
- 将子节点添加给父节点:root.appendChild(child)
- 设置元素的属性值:root.setAttribute(name,val)
- 设置节点的文本内容:root.setTextContent();
- 生成xml文件
//方式一:使用Transformer将document转换成xml TransformerFactory factory = TransformerFactory.newInstance(); Transformer transformer =factory.newTransformer(); transformer.transform(new DOMSource(document),newStreamResult("books.xml")); //方式二:使用XmlSerializer将xml序列化 FileOutputStream os = new FileOutputStream("books.xml"); //将document格式化 OutputFormat format = new OutputFormat(document); XMLSerializer xmlSerilizer = new XMLSerializer(os, format); //序列化document得到xml xmlSerilizer.serialize(document);