Как я могу проанализировать пространство имен с помощью синтаксического анализатора SAX?

Используя URL поиска Твиттера т.е. возвраты http://search.twitter.com/search.rss?q=android CSS, который имеет объект, который похож:


      @UberTwiter still waiting for @ubertwitter  android app!!!
      http://twitter.com/meals69/statuses/21158076391
      still waiting for an app!!!
      Sat, 14 Aug 2010 15:33:44 +0000
      http://twitter.com/meals69/statuses/21158076391
      Some Twitter User
      
      http://a1.twimg.com/profile_images/756343289/me2_normal.jpg
      
        recent


Довольно простой. Мой код анализирует все (заголовок, ссылка, описание, pubDate, и т.д.) без любых проблем. Однако я надеваю пустой указатель:


Я использую Java для парсинга канала RSS. Я должен обработать составной объект localnames по-другому, чем я был бы более простой localname?

Это - бит кода, который анализирует Ссылку, Описание, pubDate, и т.д.:

@Override
    public void endElement(String uri, String localName, String name)
            throws SAXException {
        super.endElement(uri, localName, name);
        if (this.currentMessage != null){
            if (localName.equalsIgnoreCase(TITLE)){
                currentMessage.setTitle(builder.toString());
            } else if (localName.equalsIgnoreCase(LINK)){
                currentMessage.setLink(builder.toString());
            } else if (localName.equalsIgnoreCase(DESCRIPTION)){
                currentMessage.setDescription(builder.toString());
            } else if (localName.equalsIgnoreCase(PUB_DATE)){
                currentMessage.setDate(builder.toString());
            } else if (localName.equalsIgnoreCase(GUID)){
                currentMessage.setGuid(builder.toString());
            } else if (uri.equalsIgnoreCase(AVATAR)){
                currentMessage.setAvatar(builder.toString());
            } else if (localName.equalsIgnoreCase(ITEM)){
                messages.add(currentMessage);
            } 
            builder.setLength(0);   
        }
    }

startDocument похож:

@Override
    public void startDocument() throws SAXException {
        super.startDocument();
        messages = new ArrayList();
        builder = new StringBuilder();

    }

startElement похож:

@Override
    public void startElement(String uri, String localName, String name,
            Attributes attributes) throws SAXException {
        super.startElement(uri, localName, name, attributes);
        if (localName.equalsIgnoreCase(ITEM)){
            this.currentMessage = new Message();
        } 
    }

Tony

7
задан Silvestri 14 August 2010 в 16:52
поделиться

3 ответа

Такой элемент, как , имеет локальное имя image_link , принадлежащее пространству имен google . Вам необходимо убедиться, что инфраструктура синтаксического анализа XML знает о пространствах имен, и тогда вам нужно будет найти этот элемент, используя соответствующее пространство имен.

Например, несколько интерфейсов SAX1 в пакете org.xml.sax объявлены устаревшими, заменены аналогами SAX2, которые включают поддержку пространства имен (например, SAX1 Parser устарел и заменен на SAX2 XMLReader ). Обратитесь к документации о том, как указать пространство имен uri или квалифицированное (с префиксом) qName .

См. Также

1
ответ дан 7 December 2019 в 18:38
поделиться

Из образца на самом деле не ясно, к какому пространству имен привязывается префикс 'google' - предыдущий ответ немного неверен, поскольку он НЕ находится в пространстве имен "google"; скорее, это пространство имен, к которому привязывается префикс "google". Таким образом, вы должны соответствовать пространству имен (идентифицированному URI), а не префиксу. SAX действительно имеет запутанный способ сообщения о комбинациях локального имени / префикса пространства имен, и это зависит от того, включена ли вообще обработка пространства имен.

Вы также можете рассмотреть альтернативные библиотеки / API для обработки XML; Хотя реализации SAX производительны, существуют более быстрые и удобные альтернативы. Реализации Stax (javax.xml.stream. *), Такие как Woodstox (и даже стандартная реализация JDK 1.6), быстра и немного удобнее. А библиотека StaxMate , построенная на основе Stax, намного проще в использовании как для чтения, так и для записи, а также быстрее, чем реализации SAX, такие как Xerces. Кроме того, у Stax API меньше багажа, связанного с обработкой пространства имен, поэтому легче увидеть, каково фактическое пространство имен элементов.

1
ответ дан 7 December 2019 в 18:38
поделиться

Как сказано в пользовательских polygenelubricants: обычно синтаксический анализатор должен знать пространство имен, чтобы обрабатывать элементы, которые принадлежат некоторому пространству имен с префиксом. (Подобно этому элементу .)

Это должно быть установлено как «функция парсера», что AFAIK может быть выполнено несколькими различными способами: Сам интерфейс XMLReader имеет метод setFeature () , который можно использовать для установки функций для определенного синтаксического анализатора, но вы также можете использовать тот же метод для класса SAXParserFactory, чтобы эта фабрика генерировала синтаксические анализаторы с уже включенными или выключенными функциями. Флаги стандартных функций SAX2 должны быть на веб-сайте SAXproject, но по крайней мере некоторые из них также перечислены в документации Java API пакета org.xml.sax .

Для простых документов вы можете попробовать воспользоваться ярлыком.Если вам на самом деле не важны пространства имен и имена элементов, как в комбинации URL + local-name, и вы можете быть уверены, что элементы, которые вы ищете (и только они), всегда имеют определенный префикс и что нет элементов из другие пространства имен с таким же локальным именем, тогда вы можете просто решить свою проблему, используя параметр qname метода startElement () вместо localName или наоборот, или добавив / удаление префикса из строки имени тега, с которой вы сравниваете.

Содержимое параметров namespaceUri , qname или localName в соответствии со спецификациями Java является фактически необязательным, и AFAIK они могут иметь значение null для эта причина. Какие из них являются нулевыми , зависит от того, какие вышеупомянутые «функции синтаксического анализатора» влияют на пространства имен. Я не знаю, может ли параметр null различаться между элементами в пространстве имен и элементами без пространства имен - я не исследовал такое поведение.

PS. XML чувствителен к регистру. Поэтому в идеале вам не нужно игнорировать регистр при сравнении строк имени тега.
-Первый пост, ура!

0
ответ дан 7 December 2019 в 18:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: