一.動態生成XML
1.使用Document動態生產XML
創建Document
1.實例化Document工廠:DocumentBuilderFactory
2.實例化Document構造器:DocumentBuilder
3.實例化Document:Document
4.創建標籤:document.createElement();
5.創建屬性:document.createAttribute();
6.建立關係:appendChild();
將Document保存到本地XML中
1.實例化轉換器工廠:TransFormerFactory
2.實例化轉化器:Transformer
3.設置來源:Source:DOMSource
4.設置目的地:Result:StreamResult
5.轉換:transform();
代碼實現
/**
* 創建XML 使用Document
* @author Cookie
*
*/
public class TestCreateXMlByDocument {
public static void main(String[] args) {
try {
//1.實例化DocumentBuilderFactory
DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
//2.通過dbf獲取DocumentBuilder
DocumentBuilder db=dbf.newDocumentBuilder();
//3.創建Document
Document document=db.newDocument();
//4.創建標籤<persons>
Element elementPersons=document.createElement("persons");
//創建<person>
Element elementPerson=document.createElement("person");
//創建<page>
Element elementPage=document.createElement("page");
//給標籤設值
elementPage.setTextContent("22");
//創建<psex>
Element elementPsex=document.createElement("psex");
elementPsex.setTextContent("男");
//5.創建屬性
Attr attrPid=document.createAttribute("pid");
//給屬性設值
attrPid.setValue("1");
Attr attrPname=document.createAttribute("pname");
attrPname.setValue("hug");
//6.建立關係
document.appendChild(elementPersons);
elementPersons.appendChild(elementPerson);
elementPerson.appendChild(elementPage);
elementPerson.appendChild(elementPsex);
elementPerson.setAttributeNode(attrPid);
elementPerson.setAttributeNode(attrPname);
System.out.println("創建OK");
//將生成的Document保存到XML文件中
//1.實例化轉換器工廠
TransformerFactory tff=TransformerFactory.newInstance();
//2.通過tff獲取轉換器
Transformer transformer=tff.newTransformer();
//來源
DOMSource source=new DOMSource(document);
//結果
StreamResult streamResult=new StreamResult(new File("my.xml"));
//3.開始轉換
transformer.transform(source, streamResult);
System.out.println("保存成功");
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (TransformerConfigurationException e) {
e.printStackTrace();
} catch (TransformerException e) {
e.printStackTrace();
}
}
}
2.dom4j
創建Document
1.使用DocumentHelper創建Document
2.添加標籤:addElement(“標籤名”);
3.添加屬性:addAttribute(“屬性名”,“屬性值”);
將Document保存到本地XML中
1.實例化輸出格式:OutputFormat.createPrettyPrint()
2.指定輸出文件路徑:XMLWriter
3.直接將對象集合,使用c標籤展示到XML文件中
1.將對象集合保存到請求域中
2.在jsp頁面,使用C標籤編譯對象集合
二.XML解析
1.DOM(Document Object Model 文檔對象模型)解析
1.實例化Document工廠:DocumentBuilderFactory
2.實例化Document構造器:DocumentBuilder
3.通過構造器讀取數據(解析數據):parse()
4.得到根節點:getDocumentElement()
5.得到根節點下面的所有子節點(NodeList):getChildNodes()
6.遍歷所有的子節點,得到某一個子節點item()
7.得到屬性的值:getAttribute(“屬性名”)
8.判斷是否是標籤:node.getNodeType==Node.ELEMNT_NODE
9.得到標籤內容:getTextContent()
2.Dom4j解析(Jaxp,JDOM)
1.實例化SAX讀取器:SAXReader
2.讀取:read()
3.得到根節點:getRootElement()
3.SAX解析(XML:Simple API for XML)
1.實例化SAX解析器工廠:SAXParserFactory
2.實例化SAX解析器:SAXParser
3.開始解析:parse()方法
4.DOM 和 SAX 解析區別:
1.DOM解析佔用內存比較大,但是方便對XML進行CRUD(增刪查改)
2.SAX優點是佔用內存小,解析速度快,缺點只適合做文檔讀取,不適合做CRUD
package com.zking.test;
import Java.io.File;
import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
/**
* 使用DOM解析XML
* @author Administrator
*
*/
public class TestParseXMLByDOM {
public static void main(String[] args) {
try {
//1.實實例化DocumentBuilderFactory
DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
//2.通過dbf獲取DocumentBuilder
DocumentBuilder db=dbf.newDocumentBuilder();
//3.解析
Document document=db.parse(new File("students.xml"));
//4.獲取跟節點<students>
Element students=document.getDocumentElement();
//5.獲取所有的<student>節點
//第一種方法
NodeList nodeList=students.getElementsByTagName("student");
for (int i = 0; i < nodeList.getLength(); i++) {
//node element
Element student=(Element) nodeList.item(i);
//獲取屬性
String sid=student.getAttribute("sid");
String sname=student.getAttribute("sname");
//獲取<student>下面的<sage><ssex>
Element elementSage=(Element) student.getElementsByTagName("sage").item(0);
Element elementSsex=(Element) student.getElementsByTagName("ssex").item(0);
String sage=elementSage.getTextContent();
String ssex=elementSsex.getTextContent();
System.out.println(sid+" "+sname+" "+sage+" "+ssex);
//第二種方法
//獲取<student>下面的<sage><ssex>
/*NodeList nodeListChild=student.getChildNodes();
for (int j = 0; j < nodeListChild.getLength(); j++) {
Node node=nodeListChild.item(j);
if(node.getNodeType()==Node.ELEMENT_NODE){
Element element=(Element) nodeListChild.item(j);
//獲取標籤的名字
String elementName=element.getNodeName();
if("sage".equals(elementName)){
//獲取<sage>的值
String sage=element.getTextContent();
System.out.println(" "+sage);
}else if("ssex".equals(elementName)){
String ssex=element.getTextContent();
System.out.println(" "+ssex);
}
}
}*/
}
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
三.XML的CRUD
1.使用DOM增刪查改
添加(在某個節點之前插入):insertBefore()
刪除:removeChild()
2.XPath(在XML文檔中查找信息的語言)
得到Document:1.實例化SAX讀取器:SAXReader
2.讀取:read()
3.得到根節點:getRootElement()
標籤:
獲取所有:persons.selectNodes(“/persons/person”);
取n個位置之後的:persons.selectNodes("/persons/person[position()>n]/pname");
取a--b之間的:persons.selectNodes("/persons/person[position()>a and position()<b]/pname");
取奇數位數據:persons.selectNodes("/persons/person[position() mod 2!=0]/pname");
獲取第一個:persons.selectSingleNode("/persons/person[1]/pname");
獲取最後一個:persons.selectSingleNode("/persons/person[last()]/pname");
獲取第N個:persons.selectSingleNode("/persons/person[n]/pname");
屬性:
取所有的屬性值:persons.selectNodes("/persons/person/@屬性名");
取某個屬性X的值爲Y的數據:persons.selectNodes("/persons/person[@x='y']/pname");