一、XML簡介
XML,全稱為可擴展標記語言,是一種可用於標記各種數據的標記語言,它和HTML類似,但XML更加通用化、靈活。
Android應用程序中的UI界面元素、應用程序數據、網絡請求等許多方面都需要用到XML。同時,由於XML的通用性,各種編程語言的數據也可以用XML描述和傳輸,從而實現跨語言開發。
XML的解析可以分為兩種:DOM(文檔對象模型)解析和SAX(Simple API for XML)解析。DOM解析將整個XML文檔都讀入內存中,然後解析,因此適合處理較小的XML文檔。而SAX解析則是一種基於事件的解析方式,它只處理所需的XML數據,較為高效,適合處理大型XML文檔。
二、DOM解析XML
DOM解析通常用於處理較小的XML文件。它將整個XML文檔讀入內存中,形成一顆樹形結構。在解析過程中,程序可以輕易地遍歷這個樹形結構,找到XML節點,進行讀取或修改。
下面是一個DOM解析XML的示例。我們通過讀取一個電影列表XML文件,將其中的電影信息輸出到控制台。
public void parseXmlWithDom() {
try {
DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = builderFactory.newDocumentBuilder();
InputStream inputStream = getResources().openRawResource(R.raw.movies);
Document document = builder.parse(inputStream);
Element rootElement = document.getDocumentElement();
NodeList movieList = rootElement.getElementsByTagName("movie");
for (int i = 0; i < movieList.getLength(); i++) {
Node movieNode = movieList.item(i);
if (movieNode.getNodeType() == Node.ELEMENT_NODE) {
Element movieElement = (Element) movieNode;
String title = movieElement.getElementsByTagName("title").item(0).getTextContent();
String year = movieElement.getElementsByTagName("year").item(0).getTextContent();
String director = movieElement.getElementsByTagName("director").item(0).getTextContent();
Log.d(TAG, "Title: " + title);
Log.d(TAG, "Year: " + year);
Log.d(TAG, "Director: " + director);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
三、SAX解析XML
SAX解析是一種基於事件的解析方式。解析器在讀取XML文檔的過程中,會觸發一些事件,程序員可以根據需要實現這些事件的處理方法,完成對XML文檔的解析。
下面是一個SAX解析XML的示例。我們通過讀取一個學生列表XML文件,將其中的學生信息輸出到控制台。
public void parseXmlWithSax() {
try {
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
InputStream inputStream = getResources().openRawResource(R.raw.students);
parser.parse(inputStream, new DefaultHandler() {
private String tagName;
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
super.startElement(uri, localName, qName, attributes);
tagName = qName;
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
super.endElement(uri, localName, qName);
tagName = null;
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
super.characters(ch, start, length);
String data = new String(ch, start, length);
if (tagName != null && tagName.equals("name")) {
Log.d(TAG, "Name: " + data);
} else if (tagName != null && tagName.equals("age")) {
Log.d(TAG, "Age: " + data);
} else if (tagName != null && tagName.equals("gender")) {
Log.d(TAG, "Gender: " + data);
}
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
四、XPath解析XML
XPath是一種查詢XML文檔的語言,它可以通過路徑表達式來定位XML節點。XPath適用於DOM解析方式,效率較高。
下面是一個XPath解析XML的示例。我們通過讀取一個手機列表XML文件,使用XPath表達式查詢出其中價格大於1000的手機信息,並輸出到控制台。
public void parseXmlWithXPath() {
try {
DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = builderFactory.newDocumentBuilder();
InputStream inputStream = getResources().openRawResource(R.raw.phones);
Document document = builder.parse(inputStream);
XPathFactory xPathFactory = XPathFactory.newInstance();
XPath xPath = xPathFactory.newXPath();
String expression = "//phone[price>1000]";
NodeList nodeList = (NodeList) xPath.evaluate(expression, document, XPathConstants.NODESET);
for (int i = 0; i < nodeList.getLength(); i++) {
Node phoneNode = nodeList.item(i);
if (phoneNode.getNodeType() == Node.ELEMENT_NODE) {
Element phoneElement = (Element) phoneNode;
String name = phoneElement.getElementsByTagName("name").item(0).getTextContent();
String price = phoneElement.getElementsByTagName("price").item(0).getTextContent();
Log.d(TAG, "Name: " + name);
Log.d(TAG, "Price: " + price);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
五、總結
Android中XML的解析方式主要有DOM、SAX和XPath三種。DOM解析將整個XML文檔都讀入內存中,SAX解析則是一種基於事件的解析方式,XPath是一種查詢XML文檔的語言。我們可以根據具體情況選擇不同的解析方式,在保證功能實現的前提下,提高程序效率和性能。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/238773.html