一、XML解析
是一种可扩展性的标记语言(Extensible Markup Language),用于描述数据
应用场合:
1、持久化存储数据
2、数据交换
3、数据配置
<?xml version="1.0" encoding="utf-8" ?>
<Person>
<ID>1001</ID>
<Name>张杰</Name>
<Age>20</Age>
<!-- -->
</Person>
简单说明一下上面的的内容:第一行是XML的声明,<Person>是根元素,<!-- -->是注释标记
元素由开始标签、元素内容和结束标签组成
XML语法-文档类型
1、在编写XML文档时,需要先使用文档声明,声明XML文档的类型
2、最简单的声明语法:<?xml version="1.0" ?>
2、用encoding属性说明文档的字符编码:<?xml version="1.0" encoding="GB2312" ?>
XML语法-元素
1、对于XML标签中出现的所有空格和换行,XML解析程序都会当作标签内容进行处理。例如:下面两段内容的意义是不一样的。
第一种
<Name>
小白
</Name>
第二种
<Name>小白</Name>
以上两种看上去的意思是一样的代表了name为“小白”,但是在XML解析程序中,将第一种里的空格与换行当成一种标记,而第二种却没有,仅从效果上来讲两种的表达的效果是一样的。2、由于在XML中,空格和换行都作为原始内容被处理,所以,在编写XML文件时,使用换行和缩进等方式来让原文件中的内容清晰可读的“良好”书写习惯可能要被迫改变。
XML语法-注释
XML文件中的注释采用:"<!--内容-->"格式
注意:
1、XML声明之前不能有注释
2、注释不能有嵌套,如下面的情况,是不正确的
<!--大段注释
... ...
<!--局部注释-->
... ...
-->
格式良好的XML文档
1、必须有XML声明语句
2、必须有且仅有一个根元素
3、标签大小写敏感
4、属性值用双引号或单引号
5、标签成对
6、元素正确嵌套
二、DOM(Document Object Model)解析
DOM解析是将XML文档在内存中转换成一个文档对象模型(通常称为DOM树),应用程序可以在任何时候访问XML文档中的任何一部分数据,因此,DOM解析的机制也被称为随机访问机制。
注意:DOM解析对内存的需求比较高
DOM解析的步骤:
1、建立DocumentBuilderFactory
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
2、建立DocumentBuilder
DocumentBuilder builder = factory.newDocumentBuilder();
3、建立Document
Document doc = builder.parse("需要读取的文件路径");
4、建立NodeList
NodeList nl = doc.getElementByTagName("读取标签名称");
5、进行XML信息读取
三、SAX(Simple APIs for XML)解析
SAX是一个用于处理XML事件驱动的“推”模型,在读取文档时激活一系列事件,这些事件被推给事件处理器,然后由事件处理器提供对文档内容的访问。
通常用于查找、读取XML数据
SAX解析步骤:
1、编写SAX解析器,该解析器类继承自DefaultHandler类,同时重写相关方法。
2、建立SAX解析工厂
SAXParseFactory factory = SAXParseFactory.newInstance();
3、构造解析器
SAXParse parser = factory.newSAXParse();
4、解析XML
parser.parse("XML文件路径",解析器实例化对象);
XML解析的实现方式
DOM
解析XML文档转换成DOM树进行解析。
SAX
以事件通知的方法进行解析。
DOM4j解析XML
一、生成XML
Document doc = DocumentHelper.createDocument();
Element root = doc.addElement("schools");
Element school1 = root.addElement("school");
...
XMLWriter xw = new XMLWriter(outputStream,outputformat);
xw.write(doc);//将XML写入到磁盘上
二、解析XML
SAXReader sr = new SAXReader();
Document doc = sr.read("要读取的xml文件");
Element root = doc.getRootElement();//获取根元素
//获取根元素下的所有直属元素的迭代器
Iterator<Element> iter = root.elementIterator();
XML文件的编写
<?xml version="1.0" encoding="utf-8" ?>
<users>
<user>
<id>12</id>
<name>小白</name>
<adds>
<address type="home">
<province>河南省</province>
<city>郑州市</city>
</address>
<address type="eork">
<province>陕西省</province>
<city>西安市</city>
</address>
</adds>
</user>
<user>
<id>13</id>
<name>大白</name>
<adds>
<address type="home">
<province>陕西省</province>
<city>商洛市</city>
</address>
<address type="eork">
<province>浙江省</province>
<city>杭州市</city>
</address>
</adds>
</user>
</users>
DOM解析的实例:
在这里我们用到的XML文件是我们上面所写到的userInfo.xml文件
package dom;
import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
/**
* 将XML文件在内存中解析成DOM树
*/
public class DOMParseDemo {
public static void main(String[] args) {
//建立DocumentBuilderFactory
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
//建立DocumentBuilder
DocumentBuilder builder = null;
try {
builder = factory.newDocumentBuilder();
//建立Document,并将XML文件在内存中解析成DOM树
Document doc = builder.parse(new File("f:" + File.separator + "userInfo.xml"));
//获取所有标签名为province的节点
NodeList node = doc.getElementsByTagName("province");
String value = node.item(3).getFirstChild().getTextContent();
System.out.println(value);
System.out.println(node.item(3).getNodeName());
} catch (Exception e) {
e.printStackTrace();
}
}
}
运行结果:
使用DOM创建XML文件实例:
package dom;
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.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Text;
public class DOMCreateDemo {
public static void main(String[] args) {
//建立DocumentBuilderFactory
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
try {
//建立DocumentBuilder
DocumentBuilder builder = factory.newDocumentBuilder();
//新建Document
Document doc = builder.newDocument();
Element students = doc.createElement("students");
Element student = doc.createElement("student");
Element name = doc.createElement("name");
Element score = doc.createElement("score");
Text nameText = doc.createTextNode("张三");
Text scoreText = doc.createTextNode("93.5");
students.appendChild(student);
student.appendChild(name);
student.appendChild(score);
name.appendChild(nameText);
score.appendChild(scoreText);
doc.appendChild(students);
TransformerFactory tfFactory = TransformerFactory.newInstance();
Transformer tf = tfFactory.newTransformer();
tf.setOutputProperty(OutputKeys.ENCODING,"utf-8");
DOMSource source = new DOMSource(doc);//生成DOMSource,里面携带了document对象
//StreamResult封装了目标输出流文件
StreamResult sr = new StreamResult(new File("f:" + File.separator + "mydom.xml"));
tf.transform(source, sr);//开始向磁盘中写入
System.out.println("XML文件创建成功!");
} catch (Exception e) {
e.printStackTrace();
}
}
}
运行结果:
SAX解析DOM实例:
代码中用到的XML文件是上面的userInfo.xml文件
package sax;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
//自定义SAX解析器
public class MySAXHandler extends DefaultHandler {
//文档开始解析,自动调用该方法
@Override
public void startDocument() throws SAXException {
System.out.println("文档开始解析...");
}
//开始解析元素时,自动调用该方法
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
System.out.print("<" + qName);
for(int i = 0;i < attributes.getLength();i++) {
System.out.print(" " + attributes.getLocalName(i) + "=\"" + attributes.getValue(i) + "\"");
}
System.out.print(">");
}
//结束解析元素时,自动调用该方法
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
System.out.print("</" + qName + ">");
}
//解析到文本数据时,自动调用该方法
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
System.out.print(new String(ch,start,length));
}
@Override
public void endDocument() throws SAXException {
System.out.println("文档解析结束...");
}
}
package sax;
import java.io.File;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
public class SAXDemo {
public static void main(String[] args) {
//建立SAX解析工厂
SAXParserFactory factory = SAXParserFactory.newInstance();
//构造解析器
try {
SAXParser parser = factory.newSAXParser();
parser.parse(new File("f:" + File.separator + "userInfo.xml"), new MySAXHandler());
} catch (Exception e) {
e.printStackTrace();
}
}
}
运行结果:
DOM4j解析XML实例:
package dom4j;
import java.io.File;
import java.util.Iterator;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class DOM4jReaderDemo {
public static void main(String[] args) {
SAXReader sr = new SAXReader();
try {
Document doc = sr.read(new File("f:" + File.separator + "userInfo.xml"));
Element root = doc.getRootElement();//获取根元素
//获取根元素下的所有直属元素的迭代器
Iterator<Element> iter = root.elementIterator();
while(iter.hasNext()) {
Element e = iter.next();//获取根元素下的每个直属元素
List<Element> addressList = e.element("adds").elements("address");
for(Element n : addressList) {
String cityText = n.element("city").getText();
System.out.println(cityText);
}
}
} catch (DocumentException e) {
e.printStackTrace();
}
}
}
运行结果:
DOM4j生成XML文档实例:
package dom4j;
import java.io.*;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;
// DOM4j生成XML文档
public class DOM4jCreateDemo {
public static void main(String[] args) {
Document doc = DocumentHelper.createDocument();
Element root = doc.addElement("schools");
Element school1 = root.addElement("school");
Element name1 = school1.addElement("name");
name1.setText("清华大学");
Element address1 = school1.addElement("address");
address1.setText("北京");
Element school2 = root.addElement("school");
Element name2 = school2.addElement("name");
name2.setText("中山大学");
Element address2 = school2.addElement("address");
address2.setText("广州");
//设置输出属性
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("utf-8");//设置输出编码
XMLWriter xw = null;
try {
xw = new XMLWriter(new FileOutputStream("f:" + File.separator + "mydom4j.xml"),format);
xw.write(doc);//写出XML到磁盘上
System.out.println("写出成功!");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
运行结果: