Parsing XML Data Kewang
Parsing XML Data
Kewang
2
Sample XML<?xml version="1.0" encoding="utf-8"?><CATALOG> <CD> <TITLE>Empire Burlesque</TITLE> <ARTIST>Bob Dylan</ARTIST> <COUNTRY>USA</COUNTRY> <COMPANY>Columbia</COMPANY> <PRICE>10.90</PRICE> <YEAR>1985</YEAR> </CD> <CD> <TITLE>Hide your heart</TITLE> <ARTIST>Bonnie Tyler</ARTIST> <COUNTRY>UK</COUNTRY> <COMPANY>CBS Records</COMPANY> <PRICE>9.90</PRICE> <YEAR>1988</YEAR> </CD></CATALOG>
3
SAXSimple API for XML
4
5
SAX sample (1/2)
SAXParserFactory factory = SAXParserFactory.newInstance();SAXParser sp = factory.newSAXParser();XMLReader xr = sp.getXMLReader();InputSource is = new InputSource(new StringReader(xml.toString()));
xr.setContentHandler(handler);xr.setErrorHandler(handler);
xr.parse(is);
6
SAX sample (2/2)private DefaultHandler handler = new DefaultHandler() { private boolean hasTitle;
@Override public void characters(char[] ch, int start, int length) { if (hasTitle) { txtResult.setText(new String(ch, start, length)); } }
@Override public void endElement(String uri, String lName, String qName) { hasTitle = false; }
@Override public void startElement(String uri, String lName, String qName, Attributes attrs) { hasTitle = lName.equals("TITLE"); }};
7
XML Pull sampleXmlPullParserFactory factory = XmlPullParserFactory.newInstance();XmlPullParser xpp = factory.newPullParser();
xpp.setInput(new StringReader(xml.toString()));
int eventType = xpp.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT) { switch (eventType) { case XmlPullParser.START_TAG: if (xpp.getName().equals("TITLE")) { txtResult.setText(xpp.nextText()); }
break; }
eventType = xpp.next();}
8
DOMDocument Object Model
9
10
W3C DOM exampleDocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();DocumentBuilder builder = factory.newDocumentBuilder();Document doc = builder.parse(new ByteArrayInputStream(xml.toString().getBytes()));Element root = doc.getDocumentElement();NodeList cds = root.getChildNodes();
for (int i = 0; i < cds.getLength(); i++) { Node cd = cds.item(i);
if (cd.getNodeType() == Node.ELEMENT_NODE) { NodeList titles = cd.getChildNodes();
for (int j = 0; j < titles.getLength(); j++) { Node title = titles.item(j);
if (title.getNodeType() == Node.ELEMENT_NODE && title.getNodeName().equals("TITLE")) { txtResult.setText(title.getFirstChild().getNodeValue()); } } }}
11
JDOM example
SAXBuilder sax = new SAXBuilder();Document doc = sax.build(new StringReader(xml.toString()));Element root = doc.getRootElement();
for (Element elem : root.getChildren("CD")) { txtResult.setText(elem.getChildText("TITLE"));}
inner Structure: SAX parserouter Structure: DOM operation
12
Jsoup example
Document doc = Jsoup.parse(xml.toString());Elements titles = doc.select("TITLE");
for (Element elem : titles) { txtResult.setText(elem.text());}
v1.6.2(2012/3/27): add XML parsersupport selector syntax
13
Charts
14
SAX
XMLPULL
W3C
JDOM
JSOUP
0 100 200 300 400 500 600 700
XML parsing speed
Milliseconds
Met
hod
15
SAX
XMLPULL
W3C
JDOM
JSOUP
0 10 20 30 40 50 60
Code Line
Code Line
Met
hod
16
Which one?SAX vs. DOM
17
Which one?
Memory Speed Parser Modify Traversing
SAX Small Fast Event Can't One-way
DOM Large Slow Tree model Can Any-way
18
References
● Simple API for XML● Document Object Model● What is the "Thing" called XML?● SAX & DOM parsers● 解析XML三种方式(PULL、SAX、DOM)● [分享] 處理簡單的 XML 文件