Невозможно получить тег XML, вложенный в содержимое другого тега. - PullRequest
0 голосов
/ 19 апреля 2011

Спасибо за чтение!

Используя руководство по синтаксическому анализу XML из здесь в качестве ссылки, я пытаюсь проанализировать простой RSS-канал XML со следующей структурой.

Все работает нормально, и все значения анализируются, за исключением следующего случая: я не могу получить содержимое тега <img>.


<feed>
    <title>This is Title</title>
    <count>10</count>
    <desc>
        This is a description for a sample feed <img src="http://someimagelink.com/img.jpg" />
    </desc>
    <link>This is link</link>
</feed>

Это то, что endElement() метод выглядит следующим образом:


        @Override
        public void endElement(String uri, String localName, String qName)
            throws SAXException {
        if(localName.equals("feed")) {
            //Add Records object to ArrayList
            //Feed is a POJO class to store all the feed content. 
            //FeedList is an ArrayList to store multiple Feed objects.
            mFeedList.add(mFeed); 
        }
        else if(localName.equals("title")) {
            mFeed.setTitle(currentValue.toString());
        }
        else if(localName.equals("count")) {
            mFeed.setCount(currentValue.toString());
        }
        else if(localName.equals("desc")) {
            mFeed.setDesc(currentValue.toString());
        }
        else if(localName.equals("img")) {
             //NEVER hits here :(
            mFeed.setImageUrl(currentValue.toString());
        }
        else if(localName.equals("link")) {
            //BUT, hits here
            mFeed.setLink(currentValue.toString());
        }

Поскольку тег <img> является частью тега <desc>, код в последнем условии else if никогда не выполняется.

Примечание: Когда я читал тег <desc>, я мог выполнить ручной поиск String, чтобы получить содержимое тега <img>.Но я уверен, что должен быть более эффективный способ.

Может ли кто-нибудь помочь мне получить содержимое тега <img>?

Спасибо!

РЕДАКТИРОВАТЬ: Обновлен тег <img>.Теперь он закрыт правильно.

EDIT2: Обновление с кодом startElement() здесь.Также обновлены Feed XML и startElement() code.

@Override
public void startElement(String uri, String localName, String qName,
        Attributes attributes) throws SAXException {

    if(localName.equals("feed")) {
        //Instantiate Feed object
        mFeed = new Feed();
    }
    else if(localName.equals("title")) {
            currentValue = new StringBuffer("");
            isBuffering = true;
    }
    else if(localName.equals("count")) {
            currentValue = new StringBuffer("");
            isBuffering = true;     
    }
    else if(localName.equals("desc")) {
        currentValue = new StringBuffer("");
        isBuffering = true;
    }
    else if(localName.equals("img")) {
            currentValue = new StringBuffer("");
            isBuffering = true;
        }
    }
    else if(localName.equals("link")) {
        currentValue = new StringBuffer("");
        isBuffering = true;
    }       
}

1 Ответ

1 голос
/ 19 апреля 2011

В теге <img> на самом деле нет символьного содержимого, а значение, которое вы ищете, должно быть извлечено из атрибутов.

Для этого вам необходимо переопределить startElement(String namespaceURI, String localName, String qName, Attributes atts), распознать<img> пометьте более или менее, как вы делаете, и получите нужное значение из параметра atts.

Справка по отладке:

Использование этого(простой / глупый) обработчик:

package com.donroby.so;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class DebugHandler extends DefaultHandler {

    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes)  throws SAXException {
        printParseInfo("startElement:", uri, localName, qName);
        int attributesLength = attributes.getLength();
        for (int i = 0; i < attributesLength; i++) {
            printAttributeInfo(attributes, i);
        }
    }

    @Override
    public void endElement(String uri, String localName, String qName)  throws SAXException {
        printParseInfo("endElement:  ", uri, localName, qName);
    }

    @Override
    public void characters(char[] chars, int start, int length) throws SAXException {
        String str = "";
        for (int i = start; i < start + length; i++)
          str += chars[i];

        System.out.println("Characters: '" + str + "'");
    }

    private void printAttributeInfo(Attributes attributes, int i) {
        System.out.println(String.format("%s URI: '%s', localName: '%s', qName: '%s', Value: '%s'", "Attribute ",
                attributes.getURI(i), attributes.getLocalName(i), attributes.getQName(i), attributes.getValue(i)));
    }

    private void printParseInfo(String type, String uri, String localName, String qName) {
        System.out.println(String.format("%s URI: '%s', localName: '%s', qName: '%s'", type, uri, localName, qName));
    }

}
startElement: URI: '', localName: '', qName: 'feed'
Characters: '
    '
startElement: URI: '', localName: '', qName: 'title'
Characters: 'This is Title'
endElement:   URI: '', localName: '', qName: 'title'
Characters: '
    '
startElement: URI: '', localName: '', qName: 'count'
Characters: '10'
endElement:   URI: '', localName: '', qName: 'count'
Characters: '
    '
startElement: URI: '', localName: '', qName: 'desc'
Characters: '
        This is a description for a sample feed '
startElement: URI: '', localName: '', qName: 'img'
Attribute  URI: '', localName: 'src', qName: 'src', Value: 'http://someimagelink.com/img.jpg'
endElement:   URI: '', localName: '', qName: 'img'
Characters: '
    '
endElement:   URI: '', localName: '', qName: 'desc'
Characters: '
    '
startElement: URI: '', localName: '', qName: 'link'
Characters: 'This is link'
endElement:   URI: '', localName: '', qName: 'link'
Characters: '
'
endElement:   URI: '', localName: '', qName: 'feed'

Это указывает на то, что тег <img> действительно генерирует начальные и конечные события.

...