Parsing 只能解析标题标记--链接、描述、PUBDATE和其他将不解析。(RSS/SAX)

Parsing 只能解析标题标记--链接、描述、PUBDATE和其他将不解析。(RSS/SAX),parsing,tags,sax,podcast,Parsing,Tags,Sax,Podcast,我是android开发的新手,我一直在努力一次解析多个标记并将其显示在列表视图中 我正在使用SAX解析器,下面是我的RssParseHandler代码 public class RssParseHandler extends DefaultHandler { private List<RssItem> rssItems; private RssItem currentMessage; //private StringBuilder builder; private boolean p

我是android开发的新手,我一直在努力一次解析多个标记并将其显示在
列表视图中

我正在使用SAX解析器,下面是我的
RssParseHandler
代码

public class RssParseHandler extends DefaultHandler {
private List<RssItem> rssItems;
private RssItem currentMessage;
//private StringBuilder builder;
private boolean parseLink;
private boolean parseTitle;
private boolean parseDate;
private boolean parseDes;

public RssParseHandler() {
    rssItems = new ArrayList();
}

public List<RssItem> getItems() {


    return this.rssItems;
}


@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 RssItem();
    } else if (localName.equalsIgnoreCase("title")) {
        //currentMessage.setTitle(builder.toString());
        parseTitle = true;
    } else if (localName.equalsIgnoreCase("link")) {
        //currentMessage.setLink(builder.toString());
        parseLink = true;
    } else if (localName.equalsIgnoreCase("description")) {
        //currentMessage.setDescription(builder.toString());
       parseDes = true;
        } else if (localName.equalsIgnoreCase("pubDate")) {
        //currentMessage.setDate(builder.toString());

        parseDate = true;
    }

    //parsing enclosure tag
    else if ("enclosure".equals(localName)) {
        // Get tags attributes number
        int attrsLength = attributes.getLength();
        for (int i = 0; i < attrsLength; i++) {
            String attrName = attributes.getQName(i);  // attribute name
            if ("url".equals(attrName))   // This tag has only one attribute but it is better to check it name is correct
                currentMessage.getLink();

        }

    }
}


@Override
public void endElement(String uri, String localName, String name)
        throws SAXException {


    super.endElement(uri, localName, name);
    if (this.currentMessage != null) {
        if (localName.equalsIgnoreCase("item")) {
            rssItems.add(currentMessage);
            //currentMessage = null;
        } else if (localName.equalsIgnoreCase("link")) {
            //currentMessage.setLink(builder.toString());
            //parseLink = false;
       } else if (localName.equalsIgnoreCase("description")) {
            //currentMessage.setDescription(builder.toString());
          //parseDes = false;
        } else if (localName.equalsIgnoreCase("pubDate")){

            //currentMessage.setDate(builder.toString());
            parseDate = false;
        } else if (localName.equalsIgnoreCase("title")) {
            //currentMessage.setTitle(builder.toString());
            parseTitle = false;
        }
        //builder.setLength(0);
    }
}

@Override
public void characters(char[] ch, int start, int length)
        throws SAXException {
    super.characters(ch, start, length);
    //builder.append(ch, start, length);
    if (parseTitle) {
        if (currentMessage != null)
            currentMessage.setTitle(new String(ch, start, length));

    } else if (parseLink) {
        if (currentMessage != null) {
            currentMessage.setLink(new String(ch, start, length));
            //parseLink = false;
        }
    } else if (parseDes) {
        if (currentMessage != null)
            currentMessage.setDescription(new String(ch, start, length));
            //parseLink = false;


    } else if (parseDate) {
        if (currentMessage != null) {
            currentMessage.setDate(new String(ch, start, length));
            //currentMessage.setDate(new String(ch, start, length));
            //parseDesc = false;
        }
        }
    }

}
下面是我的ReaderAppActivity的代码,它将解析结果放入ListView:

public class ReaderAppActivity extends Fragment {

private ReaderAppActivity local;
private ListView mList;
/**
 * This method creates main application view
 */
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

    //super.onCreate(savedInstanceState);
    // Set view
    //setContentView(R.layout.fragment_rss);





    local = this;
    //int position = getArguments().getInt("position");

   // String url = getArguments().getString("url");

    // List of rivers
    String[] menus = getResources().getStringArray(R.array.menus);

    // Creating view corresponding to the fragment
    View v = inflater.inflate(R.layout.fragment_rss, container, false);
    // Set reference to this activity
    //local = this;

    GetRSSDataTask task = new GetRSSDataTask();

    // Start download RSS task
    task.execute("http://thechurchofwhatshappeningnow.libsyn.com/rss");
    //task.execute(url);

    // Debug the thread name
    Log.d("ITCRssReader", Thread.currentThread().getName());

    //mList = (ListView) findViewById(R.id.rssListMainView);

    return v;
}

private class GetRSSDataTask extends AsyncTask<String, Void, List<RssItem> > {
    @Override
    protected List<RssItem> doInBackground(String... urls) {

        // Debug the task thread name
        Log.d("ITCRssReader", Thread.currentThread().getName());

        try {
            // Create RSS reader
            RssReader rssReader = new RssReader(urls[0]);

            // Parse RSS, get items
            return rssReader.getItems();

        } catch (Exception e) {
            Log.e("ITCRssReader", e.getMessage());
        }


        return null;
    }

    @Override
    protected void onPostExecute(List<RssItem> result) {

        // Get a ListView from main view
        ListView mList = (ListView) getView().findViewById(R.id.rssListMainView);

        // Create a list adapter
        ArrayAdapter<RssItem> adapter = new ArrayAdapter<RssItem>(getActivity(),R.layout.rss_text, result);
        //ArrayAdapter<RssItem> adapter = new ArrayAdapter<RssItem>(getActivity(),R.layout.fragment_rss, result);
        // Set list adapter for the ListView
        mList.setAdapter(adapter);

        // Set list view item click listener
        mList.setOnItemClickListener(new ListListener(result, getActivity()));




    }
}
公共类ReaderAppActivity扩展了片段{
本地的私有ReaderAppActivity;
私有ListView-mList;
/**
*此方法创建主应用程序视图
*/
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
//super.onCreate(savedInstanceState);
//设置视图
//setContentView(R.layout.fragment_rss);
本地=此;
//int position=getArguments().getInt(“position”);
//字符串url=getArguments().getString(“url”);
//河流一览表
String[]menus=getResources().getStringArray(R.array.menus);
//创建与片段对应的视图
视图v=充气机。充气(R.layout.fragment_rss,容器,false);
//设置对此活动的引用
//本地=此;
GetRSSDataTask任务=新建GetRSSDataTask();
//启动下载RSS任务
任务。执行(“http://thechurchofwhatshappeningnow.libsyn.com/rss");
//task.execute(url);
//调试线程名
Log.d(“ITCRssReader”,Thread.currentThread().getName());
//mList=(ListView)findViewById(R.id.rssListMainView);
返回v;
}
私有类GetRSSDataTask扩展异步任务{
@凌驾
受保护列表doInBackground(字符串…URL){
//调试任务线程名称
Log.d(“ITCRssReader”,Thread.currentThread().getName());
试一试{
//创建RSS阅读器
RssReader RssReader=新的RssReader(URL[0]);
//解析RSS,获取项目
返回rssReader.getItems();
}捕获(例外e){
Log.e(“ITCRssReader”,e.getMessage());
}
返回null;
}
@凌驾
受保护的void onPostExecute(列表结果){
//从主视图获取ListView
ListView mList=(ListView)getView().findViewById(R.id.rssListMainView);
//创建一个列表适配器
ArrayAdapter=新的ArrayAdapter(getActivity(),R.layout.rss_text,result);
//ArrayAdapter=新的ArrayAdapter(getActivity(),R.layout.fragment_rss,result);
//为ListView设置列表适配器
mList.setAdapter(适配器);
//设置列表视图项单击侦听器
setOnItemClickListener(新的ListListener(result,getActivity());
}
}

}

根据您的
RssParseHandler
中注释掉的代码量,您显然已经为此挣扎了一段时间,并且一些早期尝试比现在更接近正确

您当前代码的问题似乎是您没有始终重置驱动您正在设置的项目的哪个部分的布尔值。通过调试,我看到它在某个点将日期设置到链接字段中

但是实际上,您使用了错误的方法进行了一些设置,因为
characters
方法不一定能提供标记的全部内容。您需要使用一个
Stringbuilder
,我可以从注释掉的代码中看出,您在某个时候尝试过这样做

如果在stringbuilder中收集文本并在
endElement
方法中执行所有设置,则实际上根本不需要布尔值,因为
endElement
方法知道要结束的标记

这是一个工作版本,它可能与您在某个时候拥有的东西不太遥远,但它去掉了所有这些标志字段

public class RssParseHandler extends DefaultHandler {
    private List<RssItem> rssItems;
    private RssItem currentMessage;
    private StringBuilder builder;

    public RssParseHandler() {
        rssItems = new ArrayList<>();
        builder = new StringBuilder();
    }

    public List<RssItem> getItems() {
        return this.rssItems;
    }

    @Override
    public void startElement(String uri, String localName, String name,
                             Attributes attributes) throws SAXException {
        super.startElement(uri, localName, name, attributes);
        builder.setLength(0);
        if (localName.equalsIgnoreCase("item")) {
            this.currentMessage = new RssItem();
        }
    }

    @Override
    public void endElement(String uri, String localName, String name)
            throws SAXException {

        super.endElement(uri, localName, name);
        if (this.currentMessage != null) {
            if (localName.equalsIgnoreCase("item")) {
                rssItems.add(currentMessage);
                currentMessage = null;
            } else if (localName.equalsIgnoreCase("link")) {
                currentMessage.setLink(builder.toString());
            } else if (localName.equalsIgnoreCase("description")) {
                currentMessage.setDescription(builder.toString());
            } else if (localName.equalsIgnoreCase("pubDate")){
                currentMessage.setDate(builder.toString());
            } else if (localName.equalsIgnoreCase("title")) {
                currentMessage.setTitle(builder.toString());
            }
        }
    }

    @Override
    public void characters(char[] ch, int start, int length)
            throws SAXException {
        super.characters(ch, start, length);
        builder.append(ch, start, length);
    }

} 
公共类RssParseHandler扩展了DefaultHandler{
私有列表站点;
私有RssItem-currentMessage;
私人建筑商;
公共RssParseHandler(){
rssItems=newarraylist();
生成器=新的StringBuilder();
}
公共列表getItems(){
返回此.rssItems;
}
@凌驾
public void startElement(字符串uri、字符串localName、字符串name、,
属性)引发SAX异常{
startElement(uri、localName、name、attributes);
builder.setLength(0);
if(localName.equalsIgnoreCase(“项”)){
this.currentMessage=new RssItem();
}
}
@凌驾
public void endElement(字符串uri、字符串localName、字符串名称)
抛出SAX异常{
super.endElement(uri、localName、name);
if(this.currentMessage!=null){
if(localName.equalsIgnoreCase(“项”)){
rssItems.add(currentMessage);
currentMessage=null;
}else if(localName.equalsIgnoreCase(“链接”)){
currentMessage.setLink(builder.toString());
}else if(localName.equalsIgnoreCase(“说明”)){
currentMessage.setDescription(builder.toString());
}else if(localName.equalsIgnoreCase(“pubDate”)){
currentMessage.setDate(builder.toString());
}else if(localName.equalsIgnoreCase(“title”)){
currentMessage.setTitle(builder.toString());
}
}
}
@凌驾
公共无效字符(字符[]ch,整数开始,整数长度)
抛出SAX异常{
超级字符(ch、开始、长度);
builder.append(ch,start,length);
}
} 
public class ReaderAppActivity extends Fragment {

private ReaderAppActivity local;
private ListView mList;
/**
 * This method creates main application view
 */
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

    //super.onCreate(savedInstanceState);
    // Set view
    //setContentView(R.layout.fragment_rss);





    local = this;
    //int position = getArguments().getInt("position");

   // String url = getArguments().getString("url");

    // List of rivers
    String[] menus = getResources().getStringArray(R.array.menus);

    // Creating view corresponding to the fragment
    View v = inflater.inflate(R.layout.fragment_rss, container, false);
    // Set reference to this activity
    //local = this;

    GetRSSDataTask task = new GetRSSDataTask();

    // Start download RSS task
    task.execute("http://thechurchofwhatshappeningnow.libsyn.com/rss");
    //task.execute(url);

    // Debug the thread name
    Log.d("ITCRssReader", Thread.currentThread().getName());

    //mList = (ListView) findViewById(R.id.rssListMainView);

    return v;
}

private class GetRSSDataTask extends AsyncTask<String, Void, List<RssItem> > {
    @Override
    protected List<RssItem> doInBackground(String... urls) {

        // Debug the task thread name
        Log.d("ITCRssReader", Thread.currentThread().getName());

        try {
            // Create RSS reader
            RssReader rssReader = new RssReader(urls[0]);

            // Parse RSS, get items
            return rssReader.getItems();

        } catch (Exception e) {
            Log.e("ITCRssReader", e.getMessage());
        }


        return null;
    }

    @Override
    protected void onPostExecute(List<RssItem> result) {

        // Get a ListView from main view
        ListView mList = (ListView) getView().findViewById(R.id.rssListMainView);

        // Create a list adapter
        ArrayAdapter<RssItem> adapter = new ArrayAdapter<RssItem>(getActivity(),R.layout.rss_text, result);
        //ArrayAdapter<RssItem> adapter = new ArrayAdapter<RssItem>(getActivity(),R.layout.fragment_rss, result);
        // Set list adapter for the ListView
        mList.setAdapter(adapter);

        // Set list view item click listener
        mList.setOnItemClickListener(new ListListener(result, getActivity()));




    }
}
public class RssParseHandler extends DefaultHandler {
    private List<RssItem> rssItems;
    private RssItem currentMessage;
    private StringBuilder builder;

    public RssParseHandler() {
        rssItems = new ArrayList<>();
        builder = new StringBuilder();
    }

    public List<RssItem> getItems() {
        return this.rssItems;
    }

    @Override
    public void startElement(String uri, String localName, String name,
                             Attributes attributes) throws SAXException {
        super.startElement(uri, localName, name, attributes);
        builder.setLength(0);
        if (localName.equalsIgnoreCase("item")) {
            this.currentMessage = new RssItem();
        }
    }

    @Override
    public void endElement(String uri, String localName, String name)
            throws SAXException {

        super.endElement(uri, localName, name);
        if (this.currentMessage != null) {
            if (localName.equalsIgnoreCase("item")) {
                rssItems.add(currentMessage);
                currentMessage = null;
            } else if (localName.equalsIgnoreCase("link")) {
                currentMessage.setLink(builder.toString());
            } else if (localName.equalsIgnoreCase("description")) {
                currentMessage.setDescription(builder.toString());
            } else if (localName.equalsIgnoreCase("pubDate")){
                currentMessage.setDate(builder.toString());
            } else if (localName.equalsIgnoreCase("title")) {
                currentMessage.setTitle(builder.toString());
            }
        }
    }

    @Override
    public void characters(char[] ch, int start, int length)
            throws SAXException {
        super.characters(ch, start, length);
        builder.append(ch, start, length);
    }

}