目录
一、XML简介
(1)XML和HTML
XML 被设计用来传输和存储数据。
HTML 被设计用来显示数据。
(2)什么是XML
- XML 指可扩展标记语言(EXtensible Markup Language).
- XML 是一种很像HTML的标记语言
- XML 的设计宗旨是传输数据,而不是显示数据。
- XML 标签没有被预定义。需要自行定义标签
- XML 被设计未具有自我描述性
- XML 是W3C的推荐标准
二、XML元素VS节点
节点包括元素节点、属性节点、文本节点;
元素一定是节点,但节点不一定是元素;
元素节点:student name sex age
属性节点:id="001"
文本节点:张三
三、DOM方式解析XML原理
基于DOM(Document Object Model,文档对象模型)解析方式,是把整个XML文档加载到内存,转换成DOM树,因此应用程序可以随机的访问DOM树的任何数据;
优点:灵活性强,速度快;
缺点:消耗资源比较多;
dom解析:
student2.xml
<?xml version="1.0" encoding="UTF-8"?>
<students>
<student>
<name id="001">张三</name>
<sex>男</sex>
<age>20</age>
</student>
<student>
<name id="002">李四</name>
<sex>女</sex>
<age>22</age>
</student>
</students>
DOM2.java
package com.java1234.xml;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
public class DOM2 {
public static void printNodeAttr(Node node) {
NamedNodeMap nameNodeMap = node.getAttributes();
for(int i=0;i<nameNodeMap.getLength();i++) {
Node attrNode = nameNodeMap.item(0);
System.out.println(attrNode.getNodeName()+":"+attrNode.getFirstChild().getNodeValue());
}
}
public static void main(String[] args) {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
try {
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse("src/student2.xml");
NodeList nodeList = doc.getElementsByTagName("students");
Element element = (Element)nodeList.item(0);
NodeList nodes = element.getElementsByTagName("student");
for(int i=0;i<nodes.getLength();i++) {
Element e = (Element)nodes.item(i);
System.out.println("姓名:"+e.getElementsByTagName("name").item(0).getFirstChild().getNodeValue());
printNodeAttr(e.getElementsByTagName("name").item(0));
System.out.println("性别:"+e.getElementsByTagName("sex").item(0).getFirstChild().getNodeValue());
System.out.println("年龄:"+e.getElementsByTagName("age").item(0).getFirstChild().getNodeValue());
System.out.println("==============");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
四、SAX方式解析XML原理
SAX 的工作原理简单地说就是对文档进行顺序扫描,当扫描到文档(document)开始与结束、元素(element) 开始与结束、文档(document)结束等地方时通知事件处理函数,由事件处理函数做相应动作,然后继续同 样的扫描,直至文档结束。
优点:消耗资源比较少;适合大文件解析;
缺点:只能读取不能修改;开发复杂;
student.xml
<?xml version="1.0" encoding="UTF-8"?>
<student>
<name id="001">张三</name>
<sex>男</sex>
<age>20</age>
</student>
student.java
package com.java1234.model;
public class Student {
private String id;
private String name;
private String sex;
private int age;
//...get set方法这里省略了,代码需加入
}
SAX02.java
package com.java1234.com;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class SAX02 extends DefaultHandler{
@Override
public void startDocument() throws SAXException {
System.out.println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
}
@Override
public void endDocument() throws SAXException {
System.out.print("\n 扫描文档结束");
}
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
System.out.print("<");
System.out.print(qName);
if(attributes!=null){
for(int i=0;i<attributes.getLength();i++){
System.out.print(" "+attributes.getQName(i)+"=\""+attributes.getValue(i)+"\"");
}
}
System.out.print(">");
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
System.out.print("</");
System.out.print(qName);
System.out.print(">");
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
System.out.print(new String(ch,start,length));
}
public static void main(String[] args) throws Exception{
SAXParserFactory factory=SAXParserFactory.newInstance();
SAXParser parser=factory.newSAXParser();
parser.parse("src/student.xml", new SAX02());
}
}
执行结果:
五、JDOM工具解析
JDOM 是一种使用 XML(标准通用标记语言下的一个子集) 的独特 Java 工具包,用于快速开发 XML 应用 程序。
JDOM 官方网站:http://www.jdom.org/
准备jar包
解析文档demo
package com.java1234.com;
import java.io.IOException;
import java.util.List;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.JDOMException;
import org.jdom2.input.SAXBuilder;
public class JDOM02 {
public static void main(String[] args) throws JDOMException, IOException {
SAXBuilder builder = new SAXBuilder();
Document document = builder.build("src/students.xml");
Element students = document.getRootElement();
List<Element> studentList = students.getChildren("student");
for(int i=0;i<studentList.size();i++) {
Element student = (Element)studentList.get(i);
String id = student.getAttributeValue("id");
String name = student.getChildText("name");
String sex = student.getChildText("sex");
String age = student.getChildText("age");
System.out.println("学号:"+id+";姓名:"+name+";性别:"+sex+";年龄:"+age);
}
}
}
生成文档demo:
package com.java1234.com;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import org.jdom2.Attribute;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.output.XMLOutputter;
public class JDOM01 {
public static void main(String[] args) {
Element student = new Element("student");
Attribute id = new Attribute("id","001");
Attribute aa = new Attribute("aa","xx");
student.setAttribute(id);
student.setAttribute(aa);
Element name = new Element("name");
name.setText("张三");
student.addContent("name");
Element sex = new Element("sex");
sex.setText("男");
student.addContent(sex);
Element age = new Element("age");
age.setText("20");
student.addContent(age);
Document document = new Document(student);
XMLOutputter out = new XMLOutputter();
out.setFormat(out.getFormat().setEncoding("UTF-8"));
try {
out.output(document, new FileOutputStream("src/student2.xml"));
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
六、DOM4J工具解析
dom4j 是一个 Java 的 XMLAPI,类似于 jdom,用来读写 XML 文件的。dom4j 是一个非常非常优秀的 JavaXML API,具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件,可以在 SourceForge 上找到它。在 IBMdeveloperWorks 上面可以找到一篇文章,对主流的 JavaXMLAPI 进行的性能、功能和易用性 的评测,dom4j 无论在哪个方面都是非常出色的。如今你可以看到越来越多的 Java 软件都在使用 dom4j 来读写 XML,特别值得一提的是连 Sun 的 JAXM 也在用 dom4j。这是必须使用的 jar 包, Hibernate 用它来读写配置文 件。
DOM4J 官方网站:http://www.dom4j.org
准备jar包
生成文档demo
package com.java1234.com;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
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 DOM4J01 {
public static void main(String[] args) {
Document document = DocumentHelper.createDocument();
Element studentElement=document.addElement("student");
studentElement.addAttribute("id", "001");
studentElement.addAttribute("aa", "xx");
Element name=studentElement.addElement("name");
name.setText("张三");
Element sex=studentElement.addElement("sex");
sex.setText("男");
Element age=studentElement.addElement("age");
age.setText("20");
OutputFormat format=OutputFormat.createPrettyPrint();
format.setEncoding("UTF-8");
try {
XMLWriter writer=new XMLWriter(new FileOutputStream("src/student3.xml"),format);
writer.write(document);
writer.close();
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
解析文档demo
package com.java1234.xml;
import java.util.Iterator;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class DOM4J02 {
public static void main(String[] args) throws Exception{
SAXReader saxReader=new SAXReader();
Document document=saxReader.read("src/students.xml");
Element rootElement=document.getRootElement();
Iterator iter=rootElement.elementIterator();
while(iter.hasNext()){
Element studentElement=(Element)iter.next();
System.out.println("学号:"+studentElement.attributeValue("id"));
System.out.println("姓名:"+studentElement.elementText("name"));
System.out.println("性别:"+studentElement.elementText("sex"));
System.out.println("年龄:"+studentElement.elementText("age"));
System.out.println("=========");
}
}
}