如果我们在SAX Parser中这样做:
public class SAXXMLHandler extends DefaultHandler {
private List<Employee> employees;
private String tempVal;
private Employee tempEmp;
public SAXXMLHandler() {
employees = new ArrayList<Employee>();
}
public List<Employee> getEmployees() {
return employees;
}
// Event Handlers
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
// reset
tempVal = "";
if (qName.equalsIgnoreCase("employee")) {
// create a new instance of employee
tempEmp = new Employee();
}
}
public void characters(char[] ch, int start, int length)
throws SAXException {
tempVal = new String(ch, start, length);
}
public void endElement(String uri, String localName, String qName)
throws SAXException {
if (qName.equalsIgnoreCase("employee")) {
// add it to the list
employees.add(tempEmp);
} else if (qName.equalsIgnoreCase("id")) {
tempEmp.setId(Integer.parseInt(tempVal));
} else if (qName.equalsIgnoreCase("name")) {
tempEmp.setName(tempVal);
} else if (qName.equalsIgnoreCase("department")) {
tempEmp.setDepartment(tempVal);
} else if (qName.equalsIgnoreCase("type")) {
tempEmp.setType(tempVal);
} else if (qName.equalsIgnoreCase("email")) {
tempEmp.setEmail(tempVal);
}
}
}
为此:
<employee>
<id>2163</id>
<name>Kumar</name>
<department>Development</department>
<type>Permanent</type>
<email>kumar@tot.com</email>
</employee>
我们将在SAX Parser中为此做些什么:
<MyResource>
<Item>First</Item>
<Item>Second</Item>
</MyResource>
我是SAX Parser的新手 以前我对同一XML的DOM和PullParser有问题 没有为解析这个简单的XML而构建任何解析器。
答案 0 :(得分:1)
要解析包含多个MyResource
条目的名为Item
的条目,您可以执行以下操作:
首先,在startDocument方法中初始化变量,以允许重用Handler:
private List<MyResource> resources;
private MyResource currentResource;
private StringBuilder stringBuilder;
public void startDocument() throws SAXException {
map = null;
employees = new ArrayList<Employee>();
stringBuilder = new StringBuilder();
}
startElement
启动时检测MyResource
内部。标记名称通常存储在qName
参数中。
当MyResource启动时,您可能希望将MyResource的实例创建为临时变量。您将提供它,直到达到其结束标记。
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
if ("MyResource".equals(qName)) {
currentResource = new MyResource();
}
stringBuilder.setLength(0); // Reset the string builder
}
需要characters
方法来读取每个标记的内容。
使用StringBuilder读取字符。 SAX可能会多次调用每个标记的字符方法:
public void characters(char[] ch, int start, int length) throws SAXException {
stringBuilder.append(ch, start, length);
}
在endElement
内,每次将关闭的标记命名为Item
并创建一个MyResource(即在某处有MyResource的实例)时,创建一个新的item
。
当关闭的标记为MyResource
时,将其添加到结果列表中并清除临时变量。
public void endElement(String uri, String localName, String qName) throws SAXException {
if("MyResource".equals(qName)) {
resources.add(currentResource);
currentResource = null;
} else if(currentResource != null && "Item".equals(qName)) {
currentResource.addItem(new Item(stringBuilder.toString()));
}
}
我假设List
内有Item
MyResource
。
不要忘记在解析后添加一个方法来检索资源:
List<MyResources> getResources() {
return resources;
}