使用 SAX 解析文档将对象添加到数组
Adding Object to Array with SAX Parsed Document
我的 xml 文件的解析器输出正确,但我无法将对象正确添加到我的数组中。我放了一个demo on runnable...
<?xml version="1.0"?>
<company>
<staff>
<firstname>yong</firstname>
<lastname>mook kim</lastname>
<nickname>mkyong</nickname>
<salary>100000</salary>
</staff>
<staff>
<firstname>low</firstname>
<lastname>yin fong</lastname>
<nickname>fong fong</nickname>
<salary>200000</salary>
</staff>
</company>
跟随 this simple SAX tutorial 我已经解析了员工 xml 并成功将其添加到列表中,但是,当我创建我的 Employee.class 并尝试设置第一个、最后一个、Nick 时和 emp 对象的薪水:
emp.setFirstName(fname);
我无法在我的对象数组中获得正确的结果:
Employee emp = new Employee();
ArrayList<Employee> empList = new ArrayList<Employee>(); //ERROR returns 21 items
ArrayList<String> testList = new ArrayList<String>(); //CORRECT returns 8 items
public void characters(char ch[], int start, int length) throws SAXException {
if (bfname) {
fname = new String(ch, start, length);
System.out.println("First Name : " + fname);
emp.setFirstName(fname);
testList.add(fname);
bfname = false;
}
if (blname) {
lname = new String(ch, start, length);
System.out.println("Last Name : " + lname);
emp.setLastName(lname);
testList.add(lname);
blname = false;
}
if (bnname) {
nname = new String(ch, start, length);
System.out.println("Nick Name : "+ nname);
emp.setNickName(nname);
testList.add(nname);
bnname = false;
}
if (bsalary) {
salary = new String(ch, start, length);
System.out.println("Salary : " + salary);
emp.setSalary(salary);
testList.add(salary);
bsalary = false;
}
empList.add(emp);
}
testList 将显示 8 个项目,empList 将显示 return 21 个项目,当在屏幕上读出时,是 xml 文档中最后一个条目的 21 行。
我哪里做错了?
已解决::: 谢谢@zakimak:
if (bfname) {
**emp = new Employee();**
fname = new String(ch, start, length);
System.out.println("First Name : " + fname);
emp.setFirstName(fname);
testList.add(fname);
bfname = false;
}
if (blname) {
lname = new String(ch, start, length);
System.out.println("Last Name : " + lname);
emp.setLastName(lname);
testList.add(lname);
blname = false;
}
if (bnname) {
nname = new String(ch, start, length);
System.out.println("Nick Name : "+ nname);
emp.setNickName(nname);
testList.add(nname);
bnname = false;
}
if (bsalary) {
salary = new String(ch, start, length);
System.out.println("Salary : " + salary);
emp.setSalary(salary);
testList.add(salary);
bsalary = false;
**empList.add(emp)**;
}
这是一个解决方案。每次从 bfname 标签开始时,您都会创建一个新员工,一旦收到 bsalary,就将其添加到列表中。这个想法是,当您从第一个标签(bfname)开始时,我们可以假设我们正在读取一个新的 Employee,因此我们创建了一个新对象。最后,当我们到达最后一个标签(bsalary)时,我们知道这是最后一个标签,应该将其添加到列表中。 您的代码的问题在于,无论读取什么标签,它都在添加 Employee 对象。 在解析 bean 的 XML 数据时,您应该定义精细的起点和终点。
if (bfname) {
emp = new Employee();
fname = new String(ch, start, length);
System.out.println("First Name : " + fname);
emp.setFirstName(fname);
testList.add(fname);
bfname = false;
}
.....
if (bsalary) {
salary = new String(ch, start, length);
System.out.println("Salary : " + salary);
emp.setSalary(salary);
testList.add(salary);
bsalary = false;
empList.add(emp);
}
public void endElement(String uri, String localName,
String qName) throws SAXException {
//System.out.println("End Element :" + qName);
if (qName.equalsIgnoreCase("STAFF")) {
empList.add(emp);
emp = new Employee();
}
}
并删除
empList.add(emp);
来自 characters
函数。
我的 xml 文件的解析器输出正确,但我无法将对象正确添加到我的数组中。我放了一个demo on runnable...
<?xml version="1.0"?>
<company>
<staff>
<firstname>yong</firstname>
<lastname>mook kim</lastname>
<nickname>mkyong</nickname>
<salary>100000</salary>
</staff>
<staff>
<firstname>low</firstname>
<lastname>yin fong</lastname>
<nickname>fong fong</nickname>
<salary>200000</salary>
</staff>
</company>
跟随 this simple SAX tutorial 我已经解析了员工 xml 并成功将其添加到列表中,但是,当我创建我的 Employee.class 并尝试设置第一个、最后一个、Nick 时和 emp 对象的薪水:
emp.setFirstName(fname);
我无法在我的对象数组中获得正确的结果:
Employee emp = new Employee();
ArrayList<Employee> empList = new ArrayList<Employee>(); //ERROR returns 21 items
ArrayList<String> testList = new ArrayList<String>(); //CORRECT returns 8 items
public void characters(char ch[], int start, int length) throws SAXException {
if (bfname) {
fname = new String(ch, start, length);
System.out.println("First Name : " + fname);
emp.setFirstName(fname);
testList.add(fname);
bfname = false;
}
if (blname) {
lname = new String(ch, start, length);
System.out.println("Last Name : " + lname);
emp.setLastName(lname);
testList.add(lname);
blname = false;
}
if (bnname) {
nname = new String(ch, start, length);
System.out.println("Nick Name : "+ nname);
emp.setNickName(nname);
testList.add(nname);
bnname = false;
}
if (bsalary) {
salary = new String(ch, start, length);
System.out.println("Salary : " + salary);
emp.setSalary(salary);
testList.add(salary);
bsalary = false;
}
empList.add(emp);
}
testList 将显示 8 个项目,empList 将显示 return 21 个项目,当在屏幕上读出时,是 xml 文档中最后一个条目的 21 行。
我哪里做错了?
已解决::: 谢谢@zakimak:
if (bfname) {
**emp = new Employee();**
fname = new String(ch, start, length);
System.out.println("First Name : " + fname);
emp.setFirstName(fname);
testList.add(fname);
bfname = false;
}
if (blname) {
lname = new String(ch, start, length);
System.out.println("Last Name : " + lname);
emp.setLastName(lname);
testList.add(lname);
blname = false;
}
if (bnname) {
nname = new String(ch, start, length);
System.out.println("Nick Name : "+ nname);
emp.setNickName(nname);
testList.add(nname);
bnname = false;
}
if (bsalary) {
salary = new String(ch, start, length);
System.out.println("Salary : " + salary);
emp.setSalary(salary);
testList.add(salary);
bsalary = false;
**empList.add(emp)**;
}
这是一个解决方案。每次从 bfname 标签开始时,您都会创建一个新员工,一旦收到 bsalary,就将其添加到列表中。这个想法是,当您从第一个标签(bfname)开始时,我们可以假设我们正在读取一个新的 Employee,因此我们创建了一个新对象。最后,当我们到达最后一个标签(bsalary)时,我们知道这是最后一个标签,应该将其添加到列表中。 您的代码的问题在于,无论读取什么标签,它都在添加 Employee 对象。 在解析 bean 的 XML 数据时,您应该定义精细的起点和终点。
if (bfname) {
emp = new Employee();
fname = new String(ch, start, length);
System.out.println("First Name : " + fname);
emp.setFirstName(fname);
testList.add(fname);
bfname = false;
}
.....
if (bsalary) {
salary = new String(ch, start, length);
System.out.println("Salary : " + salary);
emp.setSalary(salary);
testList.add(salary);
bsalary = false;
empList.add(emp);
}
public void endElement(String uri, String localName,
String qName) throws SAXException {
//System.out.println("End Element :" + qName);
if (qName.equalsIgnoreCase("STAFF")) {
empList.add(emp);
emp = new Employee();
}
}
并删除
empList.add(emp);
来自 characters
函数。