方式一:Dom解析(Java中使用)
直接把整個xml文檔的內(nèi)容讀到內(nèi)存中,讀取的文本內(nèi)容被組成一個樹形的結(jié)構(gòu)紊选,稱為dom樹啼止。
則整個文本內(nèi)容有不同的節(jié)點(Node)組成。通過查看api可知兵罢,Node是一個接口献烦,節(jié)點有不同的類型,Attr,Element,Document都是常見的節(jié)點卖词。
Dom解析xml的基本用法如下:
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse("books.xml"); ?//books.xml是放在項目根目錄巩那,如果是其他目錄,路徑要更換此蜈。
NodeList list = document.getElementsByTagName("作者");
Node node = list.item(1);
System.out.println(node.getTextContent());//輸出標(biāo)簽內(nèi)的文本內(nèi)容
修改Dom樹內(nèi)容即横,并寫入到磁盤,業(yè)務(wù)代碼如下:
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse("books.xml");
NodeList list = document.getElementsByTagName("售價");
Node node = list.item(1);
node.setTextContent("99.00元"); //修改標(biāo)簽節(jié)點的內(nèi)容。
TransformerFactory transformerFactory =? TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
Source source =newDOMSource(document);
Result result =newStreamResult("books.xml");
transformer.transform(source, result);
books.xml的內(nèi)容如下:
<書架>
<書>
<書名>android開發(fā)實錄
<作者>yuewe
<售價>39.00元
<書>
<書名>Java web開發(fā)實錄
<作者>yuewe
<售價>99.00元
方式二:Sax解析(Java中使用)
Sax解析是邊讀邊解析裆赵,要注意的是解析的順序东囚,在讀到結(jié)束標(biāo)簽的時候,下一個讀到往往是標(biāo)簽內(nèi)容而不是開始標(biāo)簽战授。Sax解析的邏輯是通過實現(xiàn)一個ContentHandler里面相應(yīng)的方法(處理的邏輯寫在相應(yīng)的方法里面)并設(shè)置給XMLReader來實現(xiàn)的页藻。
業(yè)務(wù)代碼如下:
SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
SAXParser saxParser = saxParserFactory.newSAXParser();
XMLReader reader = saxParser.getXMLReader();
reader.setContentHandler(newDefaultHandler() {
booleanisshow=false;
@Override
public voidstartElement(String uri, String localName, String qName, Attributes attributes)throwsSAXException {
if(qName.equals("售價")) {
isshow=true;
}
}
@Override
public voidendElement(String uri, String localName, String qName)throwsSAXException {
if(qName.equals("售價")) {
isshow=false;
}
}
@Override
public voidcharacters(char[] ch,intstart,intlength)throwsSAXException {
if(isshow) {
String content =newString(ch, start, length);
System.out.println(content);
}
}
});
reader.parse("books.xml");
方式三:Pull解析(Android主要使用)
pull解析主要是用于Android上,Java上也要用的話植兰,要添加相應(yīng)的jar包份帐。pull解析與sax解析相似,但是用法有點不一樣钉跷。而且sax解析一開始就要解析到末尾,而pull解析則是通過調(diào)用xmlPullParser.next()方法來解析下一部分(這里不是太清楚肚逸,以后有空測試是不是一次next解析一行)爷辙。
直接上代碼:
XmlPullParserFactory xmlPullParserFactory = XmlPullParserFactory.newInstance();
XmlPullParser xmlPullParser = xmlPullParserFactory.newPullParser();
xmlPullParser.setInput(newFileInputStream(newFile("books.xml")),"utf-8");
inttype = xmlPullParser.getEventType();
List books =newArrayList<>();
Book b =null;
while(type != XmlPullParser.END_DOCUMENT) {
switch(type) {
caseXmlPullParser.START_TAG:
if(xmlPullParser.getName().equals("書名")) {
b.setTitle(xmlPullParser.nextText());
}else if(xmlPullParser.getName().equals("書")) {
b =newBook();
}else if(xmlPullParser.getName().equals("作者")) {
b.setAuthor(xmlPullParser.nextText());
}else if(xmlPullParser.getName().equals("售價")) {
b.setPrice(xmlPullParser.nextText());
}
;
break;
caseXmlPullParser.END_TAG:
if(xmlPullParser.getName().equals("書")) {
books.add(b);
}
;
break;
}
type = xmlPullParser.next();
}
for(Book book : books) {
System.out.println(book);
}
}
總結(jié):考慮到一些應(yīng)用場景和一些限制,Android端基本用的都是自帶帶的pull解析朦促,而dom解析一次把數(shù)據(jù)讀取到內(nèi)存中膝晾,很耗內(nèi)存。而Android系統(tǒng)給每個應(yīng)用分配的內(nèi)存是固定的务冕,雖然可以通過添加多進程的方式添加內(nèi)存血当,但這也提高了難度,所以Android端使用sax或pull解析xml比較合適,但就是不能修改文件臊旭。
本文是作者通過學(xué)習(xí)Android黑馬視頻做的一些筆記落恼,侵刪,郵箱號m13978575424@163.com离熏。