0

如果我们在 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 解析器的新手。
以前我对同一个 XML 的DOMPullParser有问题。
没有为解析这个简单的 XML 而构建的解析器。

4

1 回答 1

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 可以为每个标签多次调用 characters 方法:

public void characters(char[] ch, int start, int length) throws SAXException {
    stringBuilder.append(ch, start, length);
}

在 中,每次命名封闭标签并创建一个 MyResource 时endElement创建一个新标签(即,您在某处有一个 MyResource 实例)。Itemitem

当封闭标记为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()));
    }
}

我假设你有一个Listof Iteminside MyResource

不要忘记在解析后添加一个方法来检索资源:

List<MyResources> getResources() {
    return resources;
}
于 2013-07-03T22:20:47.333 回答