Java SAX Parser,存储属性

时间:2011-06-13 22:29:33

标签: java xml sax

我正在尝试将当前文档位置存储在堆栈中,推送startElement,在endElement上弹出。现在我正在使用:

public void startElement(String namespaceURI, String elname,
                         String qName, Attributes atts) throws SAXException {
    original.append(innerText);
    original.append("<");
    original.append(elname);
    original.append(">");
    docStack.push(new StackElement(elname,atts));
....

不幸的是,当它稍后尝试读取atts时,它会给出错误: 引起:java.lang.IllegalStateException:属性只能在startElement()的范围内使用。

有没有快速,可靠的方法来存储属性? 另外,有没有比为每个开始标记构建新的自定义对象StackElement更好的方法呢?

2 个答案:

答案 0 :(得分:4)

当您将属性推送到自定义对象堆栈时,您将获取实际的Attributes对象,根据documentation说明这一点:

atts - 附加到元素的属性。如果没有属性,则它应为空的Attributes对象。 startElement返回后此对象的值未定义(强调我的)

您应该在startElement(...)方法中捕获Map&lt; String,String&gt;中的属性。这样你就可以在任何你想要的地方使用它们。

答案 1 :(得分:3)

如果Attributes对上下文敏感,请在StackElement构造函数中提取您需要的内容(并且不存储引用)。

这样的事情可以做到:

public class StackElement {

    private Map<String, String> map = new HashMap<String, String>();

    public StackElement(String elname, Attributes atts) {

        for (int i = 0; i <  atts.getLength(); i++) {
            map.put(atts.getQName(i),atts.getValue(i));
        }
    }
}

P.S。看起来我似乎抄袭了@ nicholas的答案,但说实话,我已经把它输入了,并在他发布时正在编写代码。