我正在尝试将当前文档位置存储在堆栈中,推送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更好的方法呢?
答案 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的答案,但说实话,我已经把它输入了,并在他发布时正在编写代码。