一、什麼是XML,XML的作用是什麼,如何編寫XML檔案?
XML就是可擴充标記語言。 與HTML相似都是标記語言。
XML提供的标記都是自定義的;HTML提供的标記都是預先定義好的。
XML用來存儲資料的文本格式;HTML是同來設計網頁。
XML是一種簡單的資料存儲語言。
如何編寫XML檔案?
下面是一個簡單的XML檔案格式:
<?xml version="1.0" encoding=”utf-8”?>
<students>
<student id=”1001” >
<name>張三</name>
<age>23</age>
<sex>男</sex>
</student>
<student id=”1002”>
<name>李四</name>
<age>24</age>
<sex>女</sex>
</student>
</students>
說明:
<?xml version="1.0" encoding=”utf-8”?> —> xml的檔案頭,表示xml文檔開始。與html中的“”作用相似。【土地】
< students > < /students> —> 自定義的xml标記,表示一個xml檔案的根元素。【樹根】
< student id=”1001” >< /student> —> 自定義的xml标記,表示一個xml檔案的根元素中的子元素。【樹枝】id=”1001”, id=”1002” —>元素的屬性,是一個鍵值對。
< name>< /name>,< age>< /age>,< sex>< /sex> —> 自定義的xml标記,表示一個xml檔案的根元素中的子子元素。【樹葉】張三,23,男… —> 都是被存儲的具體資料值。【果實】
注意:1.标記都是自定義的,成對出現。
2.元素可以攜帶屬性,屬性是一個鍵值對,可以出現多個。
3.儲存檔案的時候,檔案的字尾名是以“.xml”結尾。
二、常見的XML檔案的生成方式
2.1 Java預設的dom生成方式/h3>
package com.wangxing.bean;
public class Person {
private int perid;
private String pername;
private int perage;
private String peraddress;
public int getPerid() {
return perid;
}
public void setPerid(int perid) {
this.perid = perid;
}
public String getPername() {
return pername;
}
public void setPername(String pername) {
this.pername = pername;
}
public int getPerage() {
return perage;
}
public void setPerage(int perage) {
this.perage = perage;
}
public String getPeraddress() {
return peraddress;
}
public void setPeraddress(String peraddress) {
this.peraddress = peraddress;
}
}
package com.wangxing.test;
import java.util.ArrayList;
import java.util.List;
import com.wangxing.bean.Person;
import com.wangxing.util.XMLHelper;
public class TestMain {
public static void main(String[] args) throws Exception{
Person person1=new Person();
person1.setPerage(1001);
person1.setPername("張三");
person1.setPerage(23);
person1.setPeraddress("西安");
Person person2=new Person();
person2.setPerage(1002);
person2.setPername("李四");
person2.setPerage(22);
person2.setPeraddress("北京");
List<Person> personlist=new ArrayList<Person>();
personlist.add(person1);
personlist.add(person2);
XMLHelper.creatXMLByJavaDom(personlist);
}
}
package com.wangxing.util;
import java.io.File;
import java.util.List;
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 com.wangxing.creatdom.Person;
public class XMLHelper {
public static void creatXMLByJavaDom(List<Person> personlist) throws Exception{
//得到DOM解析器工廠
DocumentBuilderFactory builderFactory=DocumentBuilderFactory.newInstance();
//從解析器工廠的解析器
DocumentBuilder documentBuilder=builderFactory.newDocumentBuilder();
//得到Document對象
Document document=documentBuilder.newDocument();
//設定檔案頭
document.setXmlStandalone(true);
//得到根元素
Element rootElement=document.createElement("personlist");
//循環周遊集合,建立子元素,将子元素添加到根元素
for(Person person:personlist) {
//建立子元素
Element personElement=document.createElement("person");
//為子元素添加屬性
personElement.setAttribute("perid", String.valueOf(person.getPerid()));
//建立子子元素
Element nameElement=document.createElement("pername");
Element ageElement=document.createElement("perage");
Element addressElement=document.createElement("peraddress");
//為子子元素添加資料值
nameElement.setTextContent(person.getPername());
ageElement.setTextContent(String.valueOf(person.getPerage()));
addressElement.setTextContent(person.getPeraddress());
//将子子元素添加到子元素
personElement.appendChild(nameElement);
personElement.appendChild(ageElement);
personElement.appendChild(addressElement);
//将子元素添加到根元素
rootElement.appendChild(personElement);
}
//将根元素添加到Document對象中
document.appendChild(rootElement);
//建立TransformerFactory對象
TransformerFactory tff=TransformerFactory.newInstance();
//建立Transformer對象
Transformer tf=tff.newTransformer();
//輸出内容是否換行
tf.setOutputProperty(OutputKeys.INDENT, "yes");
//建立xml檔案并寫入内容
tf.transform(new DOMSource(document), new StreamResult(new File("person1.xml")));
}
}
<?xml version="1.0" encoding="UTF-8"?><personlist>
<person perid="0">
<pername>張三</pername>
<perage>23</perage>
<peraddress>西安</peraddress>
</person>
<person perid="0">
<pername>李四</pername>
<perage>22</perage>
<peraddress>北京</peraddress>
</person>
</personlist>
2.2 使用第三方開發包
2.2.1 dom4j
Person類代碼與上面執行個體Person代碼相同
package com.wangxing.test;
import java.util.ArrayList;
import java.util.List;
import com.wangxing.creatdom.Person;
import com.wangxing.util.XMLHelper;
public class TestMain {
public static void main(String[] args) throws Exception{
Person person1=new Person();
person1.setPerid(1001);
person1.setPername("張三");
person1.setPerage(23);
person1.setPeraddress("西安");
Person person2=new Person();
person2.setPerid(1002);
person2.setPername("李四");
person2.setPerage(22);
person2.setPeraddress("北京");
List<Person> personlist=new ArrayList<Person>();
personlist.add(person1);
personlist.add(person2);
//使用第三方開發包Dom4j生成xml
XMLHelper.creatXMLByDom4j(personlist);
}
}
package com.wangxing.util;
import java.io.File;
import java.io.FileOutputStream;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;
import com.wangxing.creatdom.Person;
public class XMLHelper {
public static void creatXMLByDom4j(List<Person> personlist) throws Exception{
//得到Document對象
Document document=DocumentHelper.createDocument();
//得到根元素
Element rootElement=document.addElement("personlist");
//循環周遊集合,建立子元素,将子元素添加到根元素
for(Person person:personlist) {
//建立子元素
Element personElement=rootElement.addElement("person");
//為子元素添加屬性
personElement.addAttribute("perid", String.valueOf(person.getPerid()));
//建立子子元素
Element nameElement=personElement.addElement("pername");
Element ageElement=personElement.addElement("perage");
Element addressElement=personElement.addElement("peraddress");
//為子子元素添加資料值
nameElement.setText(person.getPername());
ageElement.setText(String.valueOf(person.getPerage()));
addressElement.setText(person.getPeraddress());
}
//設定生成xml的格式
OutputFormat format=OutputFormat.createPrettyPrint();
//設定編碼格式
format.setEncoding("UTF-8");
//建立XML字元輸出流
XMLWriter writer=new XMLWriter(new FileOutputStream(new File("person2.xml")),format);
//設定是否轉義,預設使用轉移字元
writer.setEscapeText(false);
//寫出Documat對象
writer.write(document);
//關閉流
writer.close();
}
}
<?xml version="1.0" encoding="UTF-8"?>
<personlist>
<person perid="1001">
<pername>張三</pername>
<perage>23</perage>
<peraddress>西安</peraddress>
</person>
<person perid="1002">
<pername>李四</pername>
<perage>22</perage>
<peraddress>北京</peraddress>
</person>
</personlist>
2.2.2 jdom
package com.wangxing.test;
import java.util.ArrayList;
import java.util.List;
import com.wangxing.creatdom.Person;
import com.wangxing.util.XMLHelper;
public class TestMain {
public static void main(String[] args) throws Exception{
Person person1=new Person();
person1.setPerid(1001);
person1.setPername("張三");
person1.setPerage(23);
person1.setPeraddress("西安");
Person person2=new Person();
person2.setPerid(1002);
person2.setPername("李四");
person2.setPerage(22);
person2.setPeraddress("北京");
List<Person> personlist=new ArrayList<Person>();
personlist.add(person1);
personlist.add(person2);
//使用第三方開發包jdom生成xml
XMLHelper.creatXMLByJdom(personlist);
}
}
package com.wangxing.util;
import java.io.File;
import java.io.FileOutputStream;
import java.util.List;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;
import com.wangxing.creatdom.Person;
public class XMLHelper {
public static void creatXMLByJdom(List<Person> personlist) throws Exception{
//得到根元素
Element rootElement=new Element("personlist");
//循環周遊集合,建立子元素,将子元素添加到根元素
for(Person person:personlist) {
//建立子元素
Element personElement=new Element("person");
//為子元素添加屬性
personElement.setAttribute("perid", String.valueOf(person.getPerid()));
//建立子子元素
Element nameElement=new Element("pername");
Element ageElement=new Element("perage");
Element addressElement=new Element("peraddress");
//為子子元素添加資料值
nameElement.setText(person.getPername());
ageElement.setText(String.valueOf(person.getPerage()));
addressElement.setText(person.getPeraddress());
//将子子元素添加到子元素
personElement.addContent(nameElement);
personElement.addContent(ageElement);
personElement.addContent(addressElement);
//将子元素添加到根元素
rootElement.addContent(personElement);
}
//依賴根元素建立Document
Document document=new Document(rootElement);
//輸出Document對象
Format format=Format.getCompactFormat();
//設定換行Tab或空格
format.setIndent(" ");
format.setEncoding("UTF-8");
//建立XMLOutputter的對象
XMLOutputter outputer=new XMLOutputter(format);
//寫出Document
outputer.output(document, new FileOutputStream(new File("person3.xml")));
}
}
<?xml version="1.0" encoding="UTF-8"?>
<personlist>
<person perid="1001">
<pername>張三</pername>
<perage>23</perage>
<peraddress>西安</peraddress>
</person>
<person perid="1002">
<pername>李四</pername>
<perage>22</perage>
<peraddress>北京</peraddress>
</person>
</personlist>
三、常見的XML檔案的解析方式
實際上就是将xml檔案中儲存的資料取出,轉換成java對象
3.1 Java預設的Dom解析xml
<?xml version="1.0" encoding="UTF-8"?>
<personlist>
<person perid="1001">
<pername>張三</pername>
<perage>23</perage>
<peraddress>西安</peraddress>
</person>
<person perid="1002">
<pername>李四</pername>
<perage>22</perage>
<peraddress>北京</peraddress>
</person>
</personlist>
package com.wangxing.bean;
public class Person {
private int perid;
private String pername;
private int perage;
private String peraddress;
public int getPerid() {
return perid;
}
public void setPerid(int perid) {
this.perid = perid;
}
public String getPername() {
return pername;
}
public void setPername(String pername) {
this.pername = pername;
}
public int getPerage() {
return perage;
}
public void setPerage(int perage) {
this.perage = perage;
}
public String getPeraddress() {
return peraddress;
}
public void setPeraddress(String peraddress) {
this.peraddress = peraddress;
}
}
package com.wangxing.util;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import com.wangxing.bean.Person;
public class XMLHelper {
public static List<Person> parseXMLByDom() throws Exception{
//定義儲存對象的集合
List<Person> personlist=new ArrayList<Person>();
//得到解析器工廠
DocumentBuilderFactory builderFactory=DocumentBuilderFactory.newInstance();
//得到解析器對象
DocumentBuilder documentBuilder=builderFactory.newDocumentBuilder();
//将需要被解析的xml檔案讀取成Document對象
Document document=documentBuilder.parse(new File("person3.xml"));
//從Document對象中取出一組子元素
NodeList personNodeList=document.getElementsByTagName("person");
for(int i=0;i<personNodeList.getLength();i++) {
//建立Person對象用來儲存解析出的資料值
Person person=new Person();
//得到子元素
Node personNode=personNodeList.item(i);
//得到預設的屬性值
String perid=personNode.getAttributes().item(0).getNodeValue();
person.setPerid(Integer.parseInt(perid));
//從子元素中得到包含有子子元素的一組集合
NodeList nodeList=personNode.getChildNodes();
for(int j=0;j<nodeList.getLength();j++) {
//得到子子元素
Node node=nodeList.item(j);
if(node.getNodeName().equals("pername")) {
String pername=node.getTextContent();
person.setPername(pername);}
if(node.getNodeName().equals("perage")) {
String perage=node.getTextContent();
person.setPerage(Integer.parseInt(perage));}
if(node.getNodeName().equals("peraddress")) {
String peraddress=node.getTextContent();
person.setPeraddress(peraddress);
}
}
//将解析好的person對象裝入集合
personlist.add(person);
}
return personlist;
}
}
package com.wangxing.test;
import com.wangxing.bean.Person;
import com.wangxing.util.XMLHelper;
public class TestMain {
public static void main(String[] args)throws Exception {
//Java預設的Dom解析xml
for(Person per:XMLHelper.parseXMLByDom()) {
System.out.println(per.getPerid()+" "+per.getPername()+" "+per.getPerage()+" "+per.getPeraddress());
}
}
}
運作結果
3.2 使用dom4j解析xml
package com.wangxing.test;
import com.wangxing.bean.Person;
import com.wangxing.util.XMLHelper;
public class TestMain {
public static void main(String[] args)throws Exception {
//使用dom4j解析xml
for(Person per:XMLHelper.parseXMLByDom4j()) {
System.out.println(per.getPerid()+" "+per.getPername()+" "+per.getPerage()+" "+per.getPeraddress());
}
}
}
package com.wangxing.util;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import com.wangxing.bean.Person;
public class XMLHelper {
public static List<Person> parseXMLByDom4j() throws Exception{
//定義儲存對象的集合
List<Person>personlist=new ArrayList<Person>();
//建立xml解析器對象
SAXReader saxReader=new SAXReader();
//通過解析器對象讀取被解析的xml檔案一個Document
Document document=saxReader.read(new File("person3.xml"));
//得到根元素
Element rootElemet=document.getRootElement();
//從根元素中得到一組person的子元素
List<Element>elementlist=rootElemet.elements("person");
for(Element perElement:elementlist) {
//建立Person對象用來儲存解析出的資料值
Person person=new Person();
//根據屬性名稱得到屬性值
String perid=perElement.attributeValue("perid");
//得到子子元素
Element nameElement=perElement.element("pername");
Element ageElement=perElement.element("perage");
Element addressElement=perElement.element("peraddress");
//得到子子元素的資料值
String pername=nameElement.getText();
String perage=ageElement.getText();
String peraddress=addressElement.getText();
//封裝Person對象
person.setPerid(Integer.parseInt(perid));
person.setPername(pername);
person.setPerage(Integer.parseInt(perage));
person.setPeraddress(peraddress);
//将封裝Person對象裝入集合
personlist.add(person);
}
return personlist;
}
}
運作結果
3.3 使用jdom解析xml
package com.wangxing.test;
import com.wangxing.bean.Person;
import com.wangxing.util.XMLHelper;
public class TestMain {
public static void main(String[] args)throws Exception {
//使用jdom解析xml
for(Person per:XMLHelper.parseXMLByjdom()) {
System.out.println(per.getPerid()+" "+per.getPername()+" "+per.getPerage()+" "+per.getPeraddress());
}
}
}
package com.wangxing.util;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;
import com.wangxing.bean.Person;
public class XMLHelper {
public static List<Person> parseXMLByjdom() throws Exception{
//定義儲存對象的集合
List<Person>personlist=new ArrayList<Person>();
//建立xml解析器對象
SAXBuilder saxbuilder=new SAXBuilder();
//通過解析器對象讀取被解析的xml檔案一個Document
Document document=saxbuilder.build(new File("person3.xml"));
//得到根元素
Element rootElemet=document.getRootElement();
//從根元素中得到一組person的子元素
List<Element>elementlist=rootElemet.getChildren("person");
for(org.jdom.Element perElement:elementlist) {
//建立Person對象用來儲存解析出的資料值
Person person=new Person();
//根據屬性名稱得到屬性值
String perid=perElement.getAttributeValue("perid");
//得到子子元素
Element nameElement=perElement.getChild("pername");
Element ageElement=perElement.getChild("perage");
Element addressElement=perElement.getChild("peraddress");
//得到子子元素的資料值
String pername=nameElement.getText();
String perage=ageElement.getText();
String peraddress=addressElement.getText();
//封裝Person對象
person.setPerid(Integer.parseInt(perid));
person.setPername(pername);
person.setPerage(Integer.parseInt(perage));
person.setPeraddress(peraddress);
//将封裝Person對象裝入集合
personlist.add(person);
//建立Person對象用來儲存解析出的資料值
//Person person=new Person();
//person.setPerid(Integer.parseInt(perElement.getAttributeValue("perid")));
//person.setPername(perElement.getChildText("pername"));
//person.setPerage(Integer.parseInt(perElement.getAttributeValue("perage")));
//person.setPeraddress(perElement.getAttributeValue("peraddress"));
//将封裝的Person對象裝入集合
//personlist.add(person);
}
return personlist;
}
}
運作結果
3.4 使用SAX(Simple API for XML)解析
package com.wangxing.test;
import com.wangxing.bean.Person;
import com.wangxing.util.XMLHelper;
public class TestMain {
public static void main(String[] args) throws Exception {
//使用sax解析xml
for(Person per:XMLHelper.parseXMLBySax()) {
System.out.println(per.getPerid()+" "+per.getPername()+" "+per.getPerage()+" "+per.getPeraddress());
}
}
}
package com.wangxing.util;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import com.wangxing.bean.Person;
public class XMLHelper {
public static List<Person> parseXMLBySax()throws Exception{
//定義儲存對象的集合
List<Person> personlist=new ArrayList<Person>();
//得到SAX解析器工廠
SAXParserFactory saxfac=SAXParserFactory.newInstance();
//從工廠中得到解析器對象
SAXParser saxParser=saxfac.newSAXParser();
//解析方法的參數
//參數1--File對象【被解析的xml檔案】
//參數2--DefuItHandler對象【具體的xml解析過程】
//需要建立一個DefaultHandler類的子類,重寫解析過程
MyDefaultHandler myDefaultHandler=new MyDefaultHandler();
saxParser.parse(new File("person3.xml"),myDefaultHandler );
return myDefaultHandler.getPersonList();
}
}
package com.wangxing.util;
import java.util.ArrayList;
import java.util.List;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import com.wangxing.bean.Person;
public class MyDefaultHandler extends DefaultHandler{
private List<Person> personList=null;
private Person person=null;
private String elementName="";
public List<Person> getPersonList(){
return personList;
}
//文檔開始解析方法
@Override
public void startDocument() throws SAXException {
personList=new ArrayList<Person>();
}
/**
* 元素開始的解析方法
*/
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
if(qName.equals("person")) {
person=new Person();
//得到perid的屬性值
String perid=attributes.getValue("perid");
person.setPerid(Integer.parseInt(perid));
}
if(qName.equals("pername")) {
elementName=qName;
}
if(qName.equals("perage")) {
elementName=qName;
}
if(qName.equals("peraddress")) {
elementName=qName;
}
}
/**
* 讀取文本值資料
*/
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
String value=new String(ch,start,length);
if(elementName.equals("pername")) {
person.setPername(value);
}
if(elementName.equals("perage")) {
person.setPerage(Integer.parseInt(value));
}
if(elementName.equals("peraddress")) {
person.setPeraddress(value);
}
}
/**
* 元素結束的解析方法
*/
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
if(qName.equals("person")) {
personList.add(person);
person=null;
elementName="";
}else {
elementName="";
}
}
/**
* 文檔結束的解析方法
*/
@Override
public void endDocument() throws SAXException {
}
}
運作結果
四、XML檔案解析方式的差別
DOM(Document Object Model)解析的原理就是需要被解析的xml檔案,讀取成一個文檔樹【Document 對象】,依據提供的開發類庫和方法從文檔樹中得到根元素,再從根元素中得到子元素,從子元素中的到子子元素,再得到具體的資料值。
優點:結構清晰明了。
缺點:通常需要加載整個XML文檔來構造層次結構,消耗資源大.
SAX(Simple API for XML)解析xml檔案的原理是基于事件的模型,它在解析XML文檔的時候可以觸發一系列的事件,當發現給定的标簽的時候,它可以激活一個回調方法,告訴該方法指定的标簽已經找到,如果這個指定的标記中有我們需要資料值就解析,沒有就不用處理。
優點: 1.隻在讀取資料時檢查資料,不需要儲存在記憶體中
2.可以在某個條件得到滿足時停止解析,不必解析整個文檔。
3.效率和性能較高,能解析大于系統記憶體的文檔。
缺點:沒有清晰的解析結構