Ошибка синтаксического анализа XML с использованием SAX после <br> - PullRequest
0 голосов
/ 23 ноября 2011
<description>
SEBI : Decision taken by a listed investment company to dispose of a part of its
       investment is not “price sensitive information” within meaning of SEBI
      (Prohibition of Insider Trading) Regulations, 1992<br>;
      By <b>  [2011] 15 taxmann.com 229 (SAT)</b> 
</description>

Это xml, я хочу проанализировать данные после <br>.Я могу разобрать до <br>, но не могу разобрать после <br>

Это мой код класса дескриптора:

package com.exercise;

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

public class RSSHandler extends DefaultHandler {

    final int state_unknown = 0;
    final int state_title = 1;
    final int state_description = 2;
    final int state_link = 3;
    final int state_pubdate = 4;
    int currentState = state_unknown;

    RSSFeed feed;
    RSSItem item;

    boolean itemFound = false;

    RSSHandler(){
    }

    RSSFeed getFeed(){
        return feed;
    }

    @Override
    public void startDocument() throws SAXException {
        // TODO Auto-generated method stub
        feed = new RSSFeed();
        item = new RSSItem();

    }



    @Override
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
        // TODO Auto-generated method stub

        if (localName.equalsIgnoreCase("item")){
            itemFound = true;
            item = new RSSItem();
            currentState = state_unknown;
        }
        else if (localName.equalsIgnoreCase("title")){
            currentState = state_title;
        }
        else if (localName.equalsIgnoreCase("description")){
            currentState = state_description;
        }
        else if (localName.equalsIgnoreCase("link")){
            currentState = state_link;
        }
        else if (localName.equalsIgnoreCase("pubdate")){
            currentState = state_pubdate;
        }
        else{
            currentState = state_unknown;
        }

    }


    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException {
        // TODO Auto-generated method stub
        currentState = state_unknown;
        if (localName.equalsIgnoreCase("item")){
            feed.addItem(item);
        }


    }

    @Override
    public void characters(char ch[], int start, int length)
            throws SAXException {
        //super.characters(ch, start, length);
        // TODO Auto-generated method stub
        StringBuilder buf=new StringBuilder();


        if (buf!=null) {
            for (int i=start; i<start+length; i++) {
                buf.append(ch[i]);


            }

            String strCharacters=buf.toString();





                if (itemFound==true){
        // "item" tag found, it's item's parameter
            switch(currentState){
            case state_title:
                item.setTitle(strCharacters);
                break;
            case state_description:
                item.setDescription(strCharacters);  //here data coming
                break;
            case state_link:
                item.setLink(strCharacters);
                break;
            case state_pubdate:
                item.setPubdate(strCharacters);
                break;  
            default:
                break;
            }

        }

        else{
        // not "item" tag found, it's feed's parameter
            switch(currentState){
            case state_title:
                feed.setTitle(strCharacters);
                break;
            case state_description:
                feed.setDescription(strCharacters);
                break;
            case state_link:
                feed.setLink(strCharacters);
                break;
            case state_pubdate:
                feed.setPubdate(strCharacters);
                break;  
            default:
                break;
            }
        }

        currentState = state_unknown;
    }


}


}

Ответы [ 4 ]

0 голосов
/ 23 ноября 2011

Я думаю, что в вашем случае проблема в том, что вы инициализируете StringBuilder внутри characters(), поэтому каждый раз создается новый объект.Вместо инициализации в characters() попытайтесь инициализировать его в startElement()

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

         StringBuilder buf=new StringBuilder()
..........
}
0 голосов
/ 23 ноября 2011

Что-то не так с первым вставленным вами текстом. Попробуйте снова опубликовать XML в режиме кода (4 пробела в начале каждой строки).

Я подозреваю, что у вас есть XML в формате URL-кодирования, и вам придется декодировать его, прежде чем вы начнете его обрабатывать.

0 голосов
/ 23 ноября 2011

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

Я не знаю, является ли это вашей проблемой, но это будет автором.

(кавычки вокруг "чувствительной к цене информации")

0 голосов
/ 23 ноября 2011

&amp; является ссылкой на сущность XML и означает &.

По умолчанию SAX выполнит преобразование за вас, поэтому, если ваш исходный XML говорит «привет и до свидания», вы должны увидеть «привет и до свидания». перейдите по этой ссылке. Это может решить вашу проблему

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...