使用SAX Parsed Document将对象添加到数组

时间:2015-01-09 15:08:39

标签: java arrays xml

我的解析器出现了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和Salary设置为emp对象时: / p>

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将返回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)**;
        }

2 个答案:

答案 0 :(得分:1)

这是一个解决方案。每次开始使用 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);
    }

答案 1 :(得分:0)

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函数。