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

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

Вот фрагмент 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++;
    }
}

1 Ответ

2 голосов
/ 19 июня 2012

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

<Foo someattrib=“” />

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

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

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

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

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

...