android sax parses xml files (2)
在上篇文章中,简单介绍了sax解析xml的一种方式,它是继承defaultHandler方式,并重写其中的几个方法来实现的。
接下来说的第二种方式是用RootElement这个类来解析的,RootElement 内置了defaultHandler的子类,
RootElement 源码如下:
public class RootElement extends Element {
final Handler handler = new Handler();
/**
* Constructs a new root element with the given name.
*
* @param uri the namespace
* @param localName the local name
*/
public RootElement(String uri, String localName) {
super(null, uri, localName, 0);
}
/**
* Constructs a new root element with the given name. Uses an empty string
* as the namespace.
*
* @param localName the local name
*/
public RootElement(String localName) {
this("", localName);
}
/**
* Gets the SAX {@code ContentHandler}. Pass this to your SAX parser.
*/
public ContentHandler getContentHandler() {
return this.handler;
}
class Handler extends DefaultHandler {
Locator locator;
int depth = -1;
Element current = null;
StringBuilder bodyBuilder = null;
@Override
public void setDocumentLocator(Locator locator) {
this.locator = locator;
}
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
int depth = ++this.depth;
if (depth == 0) {
// This is the root element.
startRoot(uri, localName, attributes);
return;
}
// Prohibit mixed text and elements.
if (bodyBuilder != null) {
throw new BadXmlException("Encountered mixed content"
+ " within text element named " + current + ".",
locator);
}
// If we're one level below the current element.
if (depth == current.depth + 1) {
// Look for a child to push onto the stack.
Children children = current.children;
if (children != null) {
Element child = children.get(uri, localName);
if (child != null) {
start(child, attributes);
}
}
}
}
void startRoot(String uri, String localName, Attributes attributes)
throws SAXException {
Element root = RootElement.this;
if (root.uri.compareTo(uri) != 0
|| root.localName.compareTo(localName) != 0) {
throw new BadXmlException("Root element name does"
+ " not match. Expected: " + root + ", Got: "
+ Element.toString(uri, localName), locator);
}
start(root, attributes);
}
void start(Element e, Attributes attributes) {
// Push element onto the stack.
this.current = e;
if (e.startElementListener != null) {
e.startElementListener.start(attributes);
}
if (e.endTextElementListener != null) {
this.bodyBuilder = new StringBuilder();
}
e.resetRequiredChildren();
e.visited = true;
}
@Override
public void characters(char[] buffer, int start, int length)
throws SAXException {
if (bodyBuilder != null) {
bodyBuilder.append(buffer, start, length);
}
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
Element current = this.current;
// If we've ended the current element...
if (depth == current.depth) {
current.checkRequiredChildren(locator);
// Invoke end element listener.
if (current.endElementListener != null) {
current.endElementListener.end();
}
// Invoke end text element listener.
if (bodyBuilder != null) {
String body = bodyBuilder.toString();
bodyBuilder = null;
// We can assume that this listener is present.
current.endTextElementListener.end(body);
}
// Pop element off the stack.
this.current = current.parent;
}
depth--;
}
}
}以上是RootElement类得源码,从源码可以看出,它只是将defaultHandler简单的处理一下。
具体应用可以参照我写的测试源码
/**
* sax解析xml的第二种方式
* 用XMLReader 也是sax的一种方式
* @return
*/
private String saxParseSecond(){
//读取src下xml文件
InputStream inputStream =
this.getClass().getClassLoader().getResourceAsStream("saxTest.xml");
SAXParserFactory factory = SAXParserFactory.newInstance();
try {
SAXParser parse = factory.newSAXParser();
XMLReader reader = parse.getXMLReader();
reader.setContentHandler(getRootElement().getContentHandler());
reader.parse(new InputSource(inputStream));
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return result;
}/**
*
* @return 返回设置好处理机制的rootElement
*/
private RootElement getRootElement(){
/*rootElement代表着根节点,参数为根节点的tagName*/
RootElement rootElement = new RootElement("classes");
/*获取一类子节点,并为其设置相应的事件
* 这里需要注意,虽然我们只设置了一次group的事件,但是我们文档中根节点下的所有
* group却都可以触发这个事件。
* */
Element groupElement = rootElement.getChild("group");
// 读到元素开始位置时触发,如读到<group>时
groupElement.setStartElementListener(new StartElementListener() {
@Override
public void start(Attributes attributes) {
// Log.i("TEST", "start");
String groupName = attributes.getValue("name");
String groupNum = attributes.getValue("num");
result = result+"groupName ="+groupName+"groupNum = "+groupNum+"\n";
}
});
//读到元素结束位置时触发,如读到</group>时
groupElement.setEndElementListener(new EndElementListener() {
@Override
public void end() {
}
});
Element personElement = groupElement.getChild("person");
//读取<person>标签触发
personElement.setStartElementListener(new StartElementListener() {
@Override
public void start(Attributes attributes) {
String personName = attributes.getValue("name");
String age = attributes.getValue("age");
result = result+"personName ="+personName+"age = "+age+"\n";
}
});
//读取</person>标签触发
personElement.setEndElementListener(new EndElementListener() {
@Override
public void end() {
}
});
Element chinese = personElement.getChild("chinese");
// chinese.setTextElementListener(new TextElementListener() {
//
// @Override
// public void end(String body) {
// // TODO Auto-generated method stub
//
// }
//
// @Override
// public void start(Attributes attributes) {
// // TODO Auto-generated method stub
//
// }
// });
// 读到文本的末尾时触发,这里的body即为文本的内容部分
chinese.setEndTextElementListener(new EndTextElementListener() {
@Override
public void end(String body) {
Pattern p = Pattern.compile("\\s*|\t|\r|\n");
Matcher m = p.matcher(body);
body = m.replaceAll("");
result = result+"chinese ="+body;
}
});
Element english = personElement.getChild("english");
english.setEndTextElementListener(new EndTextElementListener() {
@Override
public void end(String body) {
Pattern p = Pattern.compile("\\s*|\t|\r|\n");
Matcher m = p.matcher(body);
body = m.replaceAll("");
result = result+"english ="+body+"\n";
}
});
return rootElement;
}
我们都知道通过SAXParser对象解析xml的方式,这里我们又从代码中看到了利用另一个对象XMLReader进行解析,那么两者到底有什么联系和区别呢?
其实SAXParser是在SAX 1.0 定义的,而XMLReader则是在2.0中才开始出现的。你可以认为XMLReader的出现是为了替代SAXParser解析的,两者本质上干的事情是一样的,只不过XMLReader的功能更加的强悍而已。
关于XMLReader的获取方式,除了通过SAXParser的getXMLReader方法获得之外,我们还可以通过以下两种方式。
XMLReader parser=XMLReaderFactory.createXMLReader(); (1) XMLReader parser=XMLReaderFactory.createXMLReader(String className); (2)
以上就是android sax解析xml文件(二)的内容,更多相关内容请关注PHP中文网(m.sbmmt.com)!
Hot AI Tools
Undress AI Tool
Undress images for free
AI Clothes Remover
Online AI tool for removing clothes from photos.
Undresser.AI Undress
AI-powered app for creating realistic nude photos
ArtGPT
AI image generator for creative art from text prompts.
Stock Market GPT
AI powered investment research for smarter decisions
Hot Article
Popular tool
Notepad++7.3.1
Easy-to-use and free code editor
SublimeText3 Chinese version
Chinese version, very easy to use
Zend Studio 13.0.1
Powerful PHP integrated development environment
Dreamweaver CS6
Visual web development tools
SublimeText3 Mac version
God-level code editing software (SublimeText3)
Hot Topics
20519
7
13632
4
Tencent Yuanbao official website latest login entrance Tencent Yuanbao AI usage address
Feb 04, 2026 pm 06:06 PM
The latest login portal of Tencent Yuanbao official website is https://yuanbao.tencent.com/, which is a direct web portal deployed by Tencent. It supports mainstream browsers without installation and has features such as lightweight loading, multi-round conversation memory, and barrier-free access.
What is a 'hackathon” champion in the cryptocurrency industry? What do they gain?
Jan 31, 2026 pm 02:18 PM
The champion of the currency circle's "Hackerathon" is the one with the highest comprehensive score through on-chain testing, K verification, and anonymous review. He or she will enjoy cash rewards (such as $75,000 Grant), token incentives (such as 75,000 flash tokens), and ecological rights (such as conference speeches, protocol access, and application listings).
How to combine HTML5 password with fingerprint verification_Integrate biometrics to provide a convenient method [Method]
Feb 07, 2026 am 09:10 AM
HTML5 does not support direct calls to the fingerprint sensor, and biometric login must be implemented in an HTTPS environment through WebAuthenticationAPI (navigator.credentials); it is only a pure front-end control and does not have access to the hardware. The browser sandbox mechanism prohibits scripts from reading fingerprints or triggering the sensor.
How to enable Android subsystem developer mode in Win11_Windows11 WSA settings debugging
Jan 26, 2026 pm 12:24 PM
If you have turned on the WSA developer mode, you can install the APK through ADB. The operations include: 1. Turn on the developer mode in WSA "Advanced Settings" and confirm the IP and port; 2. If the switch is gray, use PowerShell to execute the Reset-AppxPackage and adb restart commands; 3. Use adbconnect to verify whether the connection is successful.
How to accurately pass and summarize multi-level product prices in nested RecyclerView
Feb 06, 2026 pm 08:54 PM
This article explains in detail how to correctly calculate and return the total price of each store (including the main price of the product, the price and quantity of add-ons) in the three-layer nested RecyclerView (store → product → add-on) structure to avoid the problem of value loss caused by the Adapter life cycle and data binding timing.
How to turn on low blue light mode in Thunderbird AirPlus_Turn on eye protection mode in Thunderbird AirPlus [Protection]
Feb 07, 2026 pm 07:16 PM
Thunderbird AirPlus can turn on the low blue light mode in four ways: 1. Press and hold the right dial on the temple for 2 seconds to quickly start and stop; 2. Adjust the "Display and Brightness → Eye Protection Mode" in the magic box settings; 3. ThunderbirdVisionApp remote synchronization configuration; 4. HDMI source device linkage to trigger hardware-level protection.
What is SAX parsing XML? The difference between SAX and DOM
Feb 05, 2026 am 06:54 AM
SAX parsing is an event-driven streaming XML processing method that triggers callbacks while reading. It has constant memory usage and is suitable for large files or memory-limited scenarios. DOM loads XML as a memory tree, which supports random access but consumes large memory.
Application of html statements_Comparison of loading speed of html statements on different devices [Introduction]
Feb 07, 2026 am 09:39 AM
HTML loading speed is not determined by tag type, but depends on resource volume, network transmission, browser parsing efficiency and device performance differences; mobile terminals need to avoid blocking scripts, inline styles, deep nesting and uncompressed HTML.




