Java:使用SAXParser获取下一个子节点
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Java:使用SAXParser获取下一个子节点,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4128字,纯文字阅读大概需要6分钟。
内容图文
![Java:使用SAXParser获取下一个子节点](/upload/InfoBanner/zyjiaocheng/758/2db32bcbf3fe449ab15db18285591139.jpg)
我有以下XML结构:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<person name="foobar">
<age>45</age>
<city>SOTown</city>
</person>
<person name="tester">
<age>51</age>
<city>There</city>
</person>
</root>
我正在使用SAXParser,我可以获得这样的节点元素(简化):
ArrayList<Person> persons = new ArrayList<Person>();
public void startElement(String uri, String localName,String qName,
Attributes attributes) throws SAXException {
if (name.equals("person")){
Person p = new Person();
p.name = attributes.getValue("name");
p.age = ???
p.city = ???
}
public void endElement(String uri, String localName,
String qName) throws SAXException {
}
问题在于p.age和p.city行.
如何获取子节点值?
谢谢.
解决方法:
您可以在处理期间更改内容处理程序,这允许您维护状态并执行上下文处理.例如,请考虑这个自包含的示例:
import java.util.ArrayList;
import java.util.List;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;
public class SAXHandler extends DefaultHandler {
private XMLReader reader;
private List<Person> people = new ArrayList<Person>();
public static void main(String[] args) {
try {
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser saxParser = factory.newSAXParser();
SAXHandler tester = new SAXHandler(saxParser.getXMLReader());
saxParser.parse("workbook.xml", tester);
System.out.println(tester.people);
} catch (Exception e) {
e.printStackTrace();
}
}
public SAXHandler(XMLReader reader) {
this.reader = reader;
}
public Person addPerson(Person person) {
this.people.add(person);
return person;
}
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
if ("person".equals(qName)) {
String name = attributes.getValue("name");
this.reader.setContentHandler(new PersonHandler(this.reader, this,
name));
}
System.out.println("Start Element: " + qName);
}
}
请注意,每当遇到person元素时,我们都会设置setContentHandler. PersonH??andler看起来像这样:
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;
public class PersonHandler extends DefaultHandler {
private Person currPerson;
private StringBuilder content;
private XMLReader reader;
private SAXHandler parentHandler;
public PersonHandler(XMLReader reader, SAXHandler parentHandler, String name) {
this.reader = reader;
this.parentHandler = parentHandler;
this.currPerson = new Person(name);
this.content = new StringBuilder();
}
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
this.content.setLength(0);
System.out.println("PersonHandler::Start Element: " + qName);
}
public void endElement(String uri, String localName, String qName)
throws SAXException {
if ("age".equals(qName)) {
this.currPerson.setAge(this.content.toString());
} else if ("city".equals(qName)) {
this.currPerson.setCity(this.content.toString());
} else if ("person".equals(qName)) {
this.parentHandler.addPerson(this.currPerson);
this.reader.setContentHandler(this.parentHandler);
}
System.out.println("PersonHandler::End Element: " + qName);
}
public void characters(char ch[], int start, int length)
throws SAXException {
this.content.append(ch, start, length);
}
}
请注意,只要我们处理完这个人,我们就会将内容处理程序重置为父处理程序.
为了完整起见,这是一个(非常)最小的人:
public class Person {
private String name;
private String age;
private String city;
public Person(String name) {
this.name = name;
}
public void setAge(String string) {
this.age = string;
}
public void setCity(String string) {
this.city = string;
}
public String toString() {
return this.name + " " + this.age + " " + this.city;
}
}
此代码将输出:
Start Element: root
Start Element: person
PersonHandler::Start Element: age
PersonHandler::End Element: age
PersonHandler::Start Element: city
PersonHandler::End Element: city
PersonHandler::End Element: person
Start Element: person
PersonHandler::Start Element: age
PersonHandler::End Element: age
PersonHandler::Start Element: city
PersonHandler::End Element: city
PersonHandler::End Element: person
内容总结
以上是互联网集市为您收集整理的Java:使用SAXParser获取下一个子节点全部内容,希望文章能够帮你解决Java:使用SAXParser获取下一个子节点所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。