Как отлавливать Attribute-события с помощью StAX XML-парсера? - PullRequest
6 голосов
/ 15 сентября 2011

Я пытаюсь проанализировать XML-файл с помощью XML-анализатора StAX. Это дает мне START_ELEMENT и END_DOCUMENT события, но не ATTRIBUTE события. Как я могу получить ATTRIBUTE события с парсером StAX?

Мой XML:

    <?xml version="1.0" encoding="utf-8"?>
    <posts>
        <row name="Jonas"/>
        <row name="John"/>
    </posts>

Мой StAX XML-парсер:

public class XMLParser {

    public void parseFile(String filename) {
        XMLInputFactory2 xmlif = (XMLInputFactory2) XMLInputFactory2.newInstance();
        xmlif.setProperty(XMLInputFactory.IS_REPLACING_ENTITY_REFERENCES, Boolean.FALSE);
        xmlif.setProperty(XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES, Boolean.FALSE);
        xmlif.setProperty(XMLInputFactory.IS_COALESCING, Boolean.FALSE);
        xmlif.configureForSpeed();

        XMLStreamReader2 xmlr = (XMLStreamReader2) 
                xmlif.createXMLStreamReader(new FileInputStream(filename));

                int eventType;
                while(xmlr.hasNext()) {
                    eventType = xmlr.next();
                    switch(eventType) {
                    case XMLStreamConstants.START_ELEMENT: 
                        if(xmlr.getName().toString().equals("row")) {
                            System.out.println("row");
                        }
                        break;
                    case XMLStreamConstants.ATTRIBUTE: 
                        System.out.println("Attribute");
                        break;
                    case XMLStreamConstants.END_DOCUMENT:
                        System.out.println("END");
                        xmlr.close();
                        break;
                    }
                }

    }

    public static void main(String[] args) {
        XMLParser p = new XMLParser();
        String filename = "data/test.xml";
        p.parseFile(filename);
    }

}

Ответы [ 2 ]

4 голосов
/ 15 сентября 2011

Вы можете получить атрибуты, когда находитесь в состоянии START_ELEMENT.См. getAttribute* методы на XMLStreamReader:

3 голосов
/ 16 сентября 2011

Целые АТРИБУТЫ даже нечетны, и, как упомянул Блейз, они не сообщаются отдельно при использовании основанного на событиях интерфейса.Это связано с тем, что атрибуты являются «частью» начального элемента и должны обрабатываться синтаксическими анализаторами (для проверки уникальности, связывания пространств имен и т. Д.).

...