XML介绍
XML是一种可扩展的标记语言。
xml 和 Html 语 言 由 同 一 种 父 语 言 SGML(Standard Generalized MarkupLanguage,标 准通用标记语言)发展出来的两种语言。
xml 由 html 发展而来,与 html 格式相似,但是比 html 严格。XML 描述的是结构、内容和语义,它不描述页面元素的格式化。HTML 侧重于如何表现信息,内容描述与显示整合为一体。XML 中的每个元素名都是成对出现的,结束标签前加一个。
- XML的作用:
- 存储、交换数据
- 配置文件
XML的语法格式
语法规范
-
必须有xml文档声明
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
- <?xml:xml文档声明的开始
- version:xml的版本,目前是1.0
- encoding:编码格式
- standalone:是否独立存在
- ?>:xml文档声明的结束
-
必须有且仅有一个根元素
-
严格区分大小写
-
属性值用引号(双引号或单引号):等号分开的名称-值对;在一个元素上,相同的属 性只能出现一次
-
标记成对
-
空标记关闭
-
元素正确嵌套
元素命名规则
- 名称中可以包含字母、数字或者其他可见字符
- 名称不能以数字开头
- 不能以 XML/xml/Xml…开头
- 名称中不能含空格
- 名称中不能含冒号(注:冒号留给命名空间使用)
实体
-
内置实体
< < > > & & " " ' '
-
自定义实体
<!DOCTYPE 根元素[ <!ENTITY 实体名 "实体内容"> ]>
- 使用实体:&实体名;
XML的组成
-
声明
-
元素
-
属性
-
CDATE
-
CDATA 节中的所有字符都会被当做元素字符数据的常量部分,而不是 XML 标记,可以输入除]]>外任意字符,不能嵌套
<![CDATA[ ...... ]]>
-
-
PCDATA
- PCDATA 的意思是被解析的字符数据(parsed character data)
- 可把字符数据想象为 XML 元素的开始标签与结束标签之间的文本
XML解析
-
基本的解析方式有两种:一种叫 SAX,另一种叫 DOM。
-
SAX(Simple API for XML)是基于事件流的解析,DOM(Document Object Model)是基于 XML 文档树结构的解析。
-
SAX:效率高,数据量小,仅一次获取;DOM:整颗树加载到内存中,耗内存,可多次获取。
DOM解析
-
解析步骤:
- 建 立 DocumentBuilderFactory : DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
- 建立 DocumentBuilder: DocumentBuilder builder = factory.newDocumentBuilder();
- 建立 Document : Document doc = builder.parse(“要解析的文件路径”);
- 建立 NodeList : NodeList nl = doc.getElementsByTagName(“读取节点”);
- 进行 XML 信息读取
public static void main(String[] args) throws Exception { // ① 建 立 DocumentBuilderFactory DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); // ② 建立 DocumentBuilder DocumentBuilder builder = factory.newDocumentBuilder(); // ③ 建立 Document Document document = builder.parse("src/test.xml"); // ④ 建立 NodeList NodeList nodeList = document.getElementsByTagName("people"); // 遍历节点集合 for (int i = 0; i < nodeList.getLength(); i++) { // 获取节点对象 Node node = nodeList.item(i); // 获取节点信息 String name = node.getNodeName(); System.out.println("根节点:" + name); // 判断people节点下的子节点的类型 short nodeType = node.getNodeType(); System.out.println("people的nodeType:" + nodeType); System.out.println("元素节点:" + Node.ELEMENT_NODE); System.out.println("文本节点:" + Node.TEXT_NODE); // 获取people节点下的子节点 (person) NodeList nodeList2 = node.getChildNodes(); // 遍历子节点 for(int j = 0; j < nodeList2.getLength(); i++) { Node node2 = nodeList2.item(i); System.out.println("people的子节点的nodeType:" + node2.getNodeType()); // 判断是否是元素节点 if (Node.ELEMENT_NODE == node2.getNodeType()) { // 元素节点 // 获取person的子节点 NodeList nodeList3 = node2.getChildNodes(); // 遍历person的子节点 for (int a = 0; a < nodeList3.getLength(); a++) { if (nodeList3.item(i).getNodeName().equals("name")) { System.out.println(nodeList3.item(i).getTextContent()); } } } } } // 也可以直接根据子节点直接取值 NodeList nodeList = document.getElementsByTagName("name"); System.out.println(nodeList.item(0).getTextContent()); NodeList nodeList2 = document.getElementsByTagName("sex"); System.out.println(nodeList2.item(0).getTextContent()); }
-
DOM 操作除了可以进行解析外,也可以进行文档的生成
- 如果想要生成 XML 文件,则在创建文档的时候,就应该使用 newDocument()方法
- 如果要将 DOM 的文档输出,本身是比较麻烦的 。一次编写多次 copy
package com.shsxt.xml; import java.io.File; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.transform.OutputKeys; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import org.w3c.dom.Document; import org.w3c.dom.Element; public class DomWriter { /** * 写入xml * @param args * @throws Exception */ public static void main(String[] args) throws Exception { //获取解析器工厂 DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance(); //获取解析器 DocumentBuilder builder = factory.newDocumentBuilder(); //创建文档 Document doc=builder.newDocument(); //创建元素、设置关系 Element root=doc.createElement("people"); doc.appendChild(root); // 将根节点追加到文档对象中 Element person=doc.createElement("person"); root.appendChild(person);// 将person节点追加到根节点中 Element name=doc.createElement("name"); person.appendChild(name); // 将name节点追加到person节点中 Element age=doc.createElement("age"); person.appendChild(age);// 将age节点追加到person节点中 name.appendChild(doc.createTextNode("Lily")); // 创建文本节点,并设置到name节点中 age.appendChild(doc.createTextNode("10")); // 创建文本节点,并设置到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); } }
DOM4J解析
-
解析步骤:
- 获取解析的文件对象
- 获取解析器
- 获取指定文件的文档对象
- 获取文档的根元素
- 根据根元素找到全部的子节点
package com.shsxt.xml; import java.io.File; import java.util.Iterator; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.io.SAXReader; public class Dom4JParser { /** * @param args * @throws Exception */ public static void main(String[] args) throws Exception { // 1、获取解析的文件对象 File file = new File("src/test.xml"); // 2、获取解析器 SAXReader reader = new SAXReader(); // 3、获取指定文件的文档对象 Document doc = reader.read(file); // 4、获取文档的根元素 Element root = doc.getRootElement(); System.out.println(root.getName()); // 5、根据跟元素找到全部的子节点 Iterator<Element> iter = root.elementIterator(); while(iter.hasNext()){ Element name = iter.next(); System.out.println("name:"+ name.getName()+", value:" + name.getStringValue()); } } }
-
使用 DocumentHelper 来创建 Document 对象
package com.shsxt.xml; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.UnsupportedEncodingException; import org.dom4j.Document; import org.dom4j.DocumentHelper; import org.dom4j.Element; import org.dom4j.io.OutputFormat; import org.dom4j.io.XMLWriter; public class Dom4jWriter { public static void main(String[] args) throws Exception { // 使用DocumentHelper来创建 Document对象 Document document = DocumentHelper.createDocument(); // 创建元素并设置关系 Element person = document.addElement("person"); Element name = person.addElement("name"); Element age = person.addElement("age"); // 设置文本 name.setText("Lily"); age.setText("10"); // 创建格式化输出器 OutputFormat of = OutputFormat.createPrettyPrint(); of.setEncoding("utf-8"); // 输出到文件 File file = new File("src/outputdom4j.xml"); FileOutputStream fos = new FileOutputStream(new File(file.getAbsolutePath())); XMLWriter writer = new XMLWriter(fos,of); // 写出 writer.write(document); writer.flush(); writer.close(); } }