Проблемы с разбором самозакрывающихся XML-тегов с помощью синтаксического анализатора SAX

У меня возникли проблемы с разбором самозакрывающихся тегов XML с помощью SAX. Я пытаюсь извлечь тег ссылки из Google Base API. Я достаточно успешно разбираю обычные теги.

Вот фрагмент xml

<entry>
  <id>http://www.google.com/base/feeds/snippets/15802191394735287303</id>
  <published>2010-04-05T11:00:00.000Z</published>
  <updated>2010-04-24T19:00:07.000Z</updated>
  <category scheme='http://base.google.com/categories/itemtypes' term='Products'/>
  <title type='text'>En-el1 Li-ion Battery+charger For Nikon Digital Camera</title>
  <link rel='alternate' type='text/html' href='http://rover.ebay.com/rover/1/711-67261-24966-0/2?ipn=psmain&amp;icep_vectorid=263602&amp;kwid=1&amp;mtid=691&amp;crlp=1_263602&amp;icep_item_id=170468125748&amp;itemid=170468125748'/>
.
.

и так далее

Я могу анализировать обновления и опубликованные теги, но не ссылку и тег категории.

Вот мои переопределения startElement и endElement

public void startElement(String uri, String localName, String qName,
     Attributes attributes) throws SAXException {
     if (qName.equals("title") && xmlTags.peek().equals("entry")) {

     insideEntryTitle = true;

   } 
   xmlTags.push(qName);

 }

public void endElement(String uri, String localName, String qName)
     throws SAXException {
   // If a "title" element is closed, we start a new line, to prepare
   // printing the new title.

   xmlTags.pop();
   if (insideEntryTitle) {
     insideEntryTitle = false;
  System.out.println();
   }
 }

декларация для xmltags..

private Stack<String> xmlTags = new Stack<String>(); 

Любая помощь, ребята?

это мой первый пост здесь.. Надеюсь, я следовал правилам публикации! огромное спасибо ребята..

Исправление: endElement вызывается. characters нет.

public void characters(char[] ch, int start, int length) throws SAXException 
{
    if (insideEntryTitle)
    {
        String url= new String(ch, start, length);
        System.out.println("url="+title);
        i++;
    }
}

person sandesh    schedule 25.04.2010    source источник
comment
Вы должны убедиться, что весь блочный код имеет отступ в четыре пробела (на этот раз я отредактировал для вас). Это также относится к образцу xml.   -  person Marcelo Cantos    schedule 25.04.2010
comment
Каковы симптомы? Ни один из методов не вызывается или только один?   -  person Marcelo Cantos    schedule 25.04.2010
comment
будем иметь в виду! вызывается только начальный элемент.   -  person sandesh    schedule 25.04.2010
comment
о, кстати .. спасибо за форматирование!   -  person sandesh    schedule 25.04.2010
comment
Я не могу воспроизвести. endElement вызывается для меня. Добавьте ведение журнала.   -  person Brett Kail    schedule 25.04.2010
comment
Мои извинения! endElement вызывается. Следующее не делает общедоступными пустые символы (char[] ch, int start, int length) throws SAXException { // отображаем символьные данные, если открывающим тегом является заголовок, а его родительским тегом является // запись if (insideEntryTitle) { String title= new Строка (кан, начало, длина); System.out.println(URL=+название); я++; } }   -  person sandesh    schedule 25.04.2010
comment
Вы смогли выяснить, как разобрать это? У меня такие же трудности с разбором XML-документа того же типа.   -  person Rudy    schedule 04.01.2018


Ответы (1)


Что делает characters, так это доставляет содержимое между тегами элементов XML (порциями, по одной порции на вызов метода). Итак, если у вас есть элемент XML, например

<Foo someattrib=“” />

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

Если вы полагаетесь на то, что метод символов должен вызываться здесь, даже если тег пуст, вы делаете это неправильно.

Метод символов добавляет текст элемента в буфер, но startElement и endElement должны отвечать за очистку и чтение из буфера, потому что endElement — это место, где вы знаете, что получили весь текст элемента. Должно быть нормально, чтобы персонажи не вызывались, если нечего читать.

Поскольку у вас может быть еще не весь контент в каком-либо одном символе, вызовите в этом методе не должно быть никакой бизнес-логики. Если она есть, то ваш код в какой-то момент не будет работать.

Чтобы узнать, как реализовать символы, см. этот пример. Если вы хотите прочитать значения атрибутов, см. этот пример.

person Nathan Hughes    schedule 19.06.2012
comment
Вы смогли выяснить, как разобрать это? У меня такие же трудности с разбором XML-документа того же типа. - person Rudy; 04.01.2018
comment
@Rudy: добавлены дополнительные пояснения и ссылки на примеры в других ответах, которые я написал. - person Nathan Hughes; 05.01.2018