Java SAX Parser, хранящий атрибуты - PullRequest
3 голосов
/ 14 июня 2011

Я пытаюсь сохранить текущую позицию документа в стеке, нажимая на 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 ]

4 голосов
/ 14 июня 2011

Когда вы помещаете атрибуты в стек пользовательских объектов, вы берете фактический объект атрибутов, который, согласно документации , говорит следующее:

atts - атрибуты, прикрепленные кэлемент.Если атрибутов нет, это должен быть пустой объект Attributes. Значение этого объекта после возврата startElement не определено (выделено мной)

Вместо этого вы должны в своем методе startElement (...) захватить атрибуты на карте,Таким образом, вы можете использовать их где угодно.

3 голосов
/ 14 июня 2011

Если 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));
        }
    }
}

ps. Может показаться, что я плагиат @ nicholas's ответ, но, честно говоря, я уже набрал его и работал над кодом, когда он писал.

...