Как именно SAX анализирует документ? - PullRequest
3 голосов
/ 14 июля 2011

Я пытаюсь проанализировать некоторые из моих первых XML-документов в SAX, просто внедрив org.xml.sax.ContentHandler, и я не знаю, понимаю ли я поток. Для данного XML-документа:

<?xml version="1.0"?>
<list>
    <item>
        <name>One</name>
        <description>The number 1, expressed in letters.
    </item>
    <item>
        <name>Two</name>
        <description>The number 2, expressed in letters.
    </item>
</list>

Каков будет ожидаемый порядок событий в парсере? Прав ли я, предполагая следующее:

startDocument()
    startElement() -> "list"

        startElement() -> "item"
            startElement() -> "name"
                characters() (>=1 times) -> "One"
            endElement() -> "name"
            startElement() -> "description"
                characters() (>=1 times) -> "The number 1, expressed in letters."
            endElement() -> "description"
        endElement() -> "item"

        startElement() -> "item"
            startElement() -> "name"
                characters() (>=1 times) -> "Two"
            endElement() -> "name"
            startElement() -> "description"
                characters() (>=1 times) -> "The number 2, expressed in letters."
            endElement() -> "description"
        endElement() -> "item"

    endElement() -> "list"
endDocument()

Это в значительной степени суть?

Кроме того, каков самый простой способ анализа? В настоящее время при каждом вызове startElement я сохраняю в качестве закрытой переменной имя текущего элемента, когда я анализирую данные в вызове characters. Есть ли более простой / лучший способ сделать это?

Ответы [ 2 ]

1 голос
/ 14 июля 2011

Да, у вас есть суть.

SAX - это интерфейс очень низкого уровня, поэтому не ждите, что он будет легким. В большинстве приложений SAX вы, вероятно, захотите поддерживать стек, где startElement помещает имя элемента в стек, а endElement выталкивает его. Если вы не обрабатываете смешанное содержимое, то функция names (), вероятно, должна добавляться к StringBuffer, связанному с элементом в верхней части стека, и вам следует обрабатывать содержимое символа в StringBuffer при возникновении события endElement. Это связано с тем, что символьное содержимое может быть разбито на несколько вызовов символов () так, как этого хочет парсер.

1 голос
/ 14 июля 2011

Конечный автомат SAX, к сожалению, плохо документирован. Вместо того, чтобы рассказывать вам некоторые детали, я бы посоветовал вам написать в качестве первого обработчика контента, который просто регистрирует все, что происходит с консолью, и играет с другим вводом.

Но ... да, у вас есть суть этого.

Что касается "самого простого способа анализа", я испытываю желание сказать "не SAX". При использовании SAX, так или иначе, вам нужно реализовать конечный автомат, который отражает структурные переходы в документе. Если документ простой, вы можете даже не распознать его как конечный автомат как таковой. Но если подумать об этом, я думаю, что будет довольно легко понять, как хранить то, что вам нужно, по мере того, как проходят события.

...