gpt4 book ai didi

Java : Getting the next child node with SAXParser

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:41:47 25 4
gpt4 key购买 nike

我有以下 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.agep.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 元素时,我们都会setContentHandlerPersonH​​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);
}

}

请注意,每当我们处理完 person 时,我们都会将内容处理程序重置为父处理程序。

为了完整起见,这里有一个(非常)最小的Person:

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 : Getting the next child node with SAXParser,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8607387/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com