java EE開發之Servlet第五課:xml解析

新夢想IT發表於2022-11-03

1. xml簡單介紹

資料儲存:資料庫做儲存存在分析和對比,XML做資料儲存更加簡潔。

資料交換: XML在跨平臺、跨語言

資料配置:XML配置快捷、簡單


2. DOM(Document Ojbect Modal)解析步驟

2.1 讀取

DocumentBuilderFactory->DocumentBuilder->Document

2.2 建立並輸出

2.3 XML文件的CRUD操作


3. DOM常見操作

1,讀取XML檔案中的內容


//讀取XML檔案中的內容

//建立一個公司

DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();

//建立隊伍

DocumentBuilder bui=factory.newDocumentBuilder();

//獲取資源(即你要去哪兒讀取資料)

Class c=Class.forName("ReadXML");//forName(本類的名稱)

InputStream in=c.getResourceAsStream("Stu.xml");

//建立樹

Document doc= bui.parse(in);

in.close();



//取出<stu>節點

NodeList nodes=doc.getElementsByTagName("stu");

for(int i=0;i<nodes.getLength();i++){

//取出<stu>節點的id屬性值

Element e=(Element)nodes.item(i);

String id=e.getAttribute("id");


//根據<stu>節點取到<stu>節點下的<name>節點

NodeList nodeList=e.getElementsByTagName("name");

//取出<name>節點下的值

Element el=(Element)nodeList.item(0);

String name=el.getTextContent();


2,往XMl中寫入資訊


//建立公司

DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();

//建立隊伍

DocumentBuilder bui=factory.newDocumentBuilder();

//建立文件物件

Document doc=bui.newDocument();

//設定版本

doc.setXmlVersion("1.0");



//寫入根節點

Element root=doc.createElement("teacher");

doc.appendChild(root);

Scanner input=new Scanner(System.in);

for(int i=0;i<3;i++){

//建立<tea>節點

Element tea=doc.createElement("tea");

System.out.println("請輸入老師的編號:");

String id=input.next();

tea.setAttribute("id", id);


//加入屬性和<name>節點

Element name=doc.createElement("name");

System.out.println("請輸入老師的姓名:");

String n=input.next();

name.setTextContent(n);


tea.appendChild(name);

root.appendChild(tea);

}

//儲存XML檔案也可呼叫SaveXML()方法



TransformerFactory fac=TransformerFactory.newInstance();

Transformer tf=fac.newTransformer();



DOMSource source=new DOMSource(doc);

StreamResult result=new StreamResult("f:/teas.xml");

tf.transform(source, result);


3,修改XMl中的資訊

//呼叫得到DOC的方法

Document doc=getDoc();

NodeList nodeList=doc.getElementsByTagName("tea");

for(int i=0;i<nodeList.getLength();i++){

Element el=(Element)nodeList.item(i);

String id=el.getAttribute("id");

if(id.equals(tea.getId())){

NodeList nodes=el.getElementsByTagName("name");

Element name=(Element)nodes.item(0);

name.setTextContent(tea.getName());

break;

}

}



//呼叫儲存的方法

SaveXML(doc);

private static final String FILE="f:/teas.xml";

//得到DOM的方法

public Document getDoc() throws ParserConfigurationException, SAXException,

IOException {

DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();

DocumentBuilder bui=factory.newDocumentBuilder();



Document doc=bui.parse(FILE);

return doc;

}

//儲存XML檔案的方法

private void SaveXML(Document doc)

throws TransformerFactoryConfigurationError,

TransformerConfigurationException, TransformerException {

TransformerFactory factory=TransformerFactory.newInstance();

Transformer tf=factory.newTransformer();


DOMSource source=new DOMSource(doc);

StreamResult result=new StreamResult(FILE);


tf.transform(source, result);

}


3,刪除XMl中的資訊

//刪除方法

public void deleteInfo(String id)throws Exception{

Document doc=getDoc();


doc.getDocumentElement();


NodeList list=doc.getElementsByTagName("tea");

for(int i=0;i<list.getLength();i++){

Element el=(Element)list.item(i);

String ids=el.getAttribute("id");

if(ids.equals(id)){

Element root=doc.getDocumentElement();

root.removeChild(el);


break;

}

}

SaveXML(doc);

}


3.SAX解析:Sax解析是按照xml檔案的順序來解析

SAX(Simple API for XML)是另一種常用的XML解析技術

SAX解析器不像DOM那樣建立一個完整的文件樹,而是在讀取文件時啟用一系列事件

這些事件被推給事件處理器,然後由事件處理器提供對文件內容的訪問

與DOM相比,SAX的優點如下:


記憶體消耗小

無需為所有節點建立物件


3.1 繼承org.xml.sax.helpers.DefaultHandler類建立SAX解析器

3.1.1 startDocument

3.1.2 endDocument

3.1.3 startElement

3.1.4 endElement

3.1.5 characters:處理元素內容時被呼叫


3.2 詳細的操作步驟解釋

1.取節點集合:nodeList getElementsByTagName(“name”);然後透過item()下標訪問相應的節點

2.取節點元素的屬性:elem.getAttribute(“id”)

3.取節點的文字內容:node.getTextContext();

3.建立節點:doc.createElement()

4.新增子節點: 父節點.appendChild(子節點);

5.刪除節點: 父節點.removeChild(子節點);

6.修改節點屬性: 節點.setAttribute(“name”,value);

7.修改節點文字內容: 節點.setTextContent("");


寫一個類,繼承:DefaultHandler,實現其五個方法:

//文件開始了

public void startDocument() throws SAXException {

System.out.println("文件開始了");

}

//文件結束了

public void endDocument() throws SAXException {

System.out.println("文件結束了");

}

//元素開始了

public void startElement(String uri, String localName, String  

                  name,Attributes attributes) throws SAXException {

if(name.equals("tea")){

System.out.println("id:" + attributes.getValue("id"));

}

}

//文字開始了

public void characters(char[] ch, int start, int length)

throws SAXException {

String str=new String(ch,start,length);

if(!str.trim().equals("")){

System.out.println("name:" + str);

}

}

//元素結束了

public void endElement(String uri, String localName, String name)

throws SAXException {  }


然後在test方法中


public static void main(String[] args)throws Exception {

SAXParserFactory fac=SAXParserFactory.newInstance();

SAXParser par=fac.newSAXParser();

par.parse("f:/teas.xml", new SaxTest());

}

New SaxTest是一個new出一個類的實類


注意:增刪改都需要 反轉義進去, 可以增刪改的方法裡面 就呼叫 反轉義方法。。。呼叫就更加方便!!!


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69940641/viewspace-2921699/,如需轉載,請註明出處,否則將追究法律責任。

相關文章