Java-安卓。解析器问题

标签 java android xml xml-parsing simple-framework

我正在制作一个带有 RSS 阅读器的非常简单的应用程序。读者工作很好,但它只给我标题,我也想要描述。 我是 android 的新手,我尝试了很多东西,但我无法让它工作。 我找到了很多解析器,但它们对我来说太复杂了,所以我希望找到一个简单的解决方案,因为它只是我想要的标题和描述。 谁能帮我?

import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

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

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class NyhedActivity extends Activity {
    String streamTitle = "";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.nyheder);

        TextView result = (TextView)findViewById(R.id.result);

           try {
       URL rssUrl = new URL("http://tv2sport.dk/rss/*/*/*/248/*/*");
       SAXParserFactory mySAXParserFactory = SAXParserFactory.newInstance();
       SAXParser mySAXParser = mySAXParserFactory.newSAXParser();
       XMLReader myXMLReader = mySAXParser.getXMLReader();
       RSSHandler myRSSHandler = new RSSHandler();
       myXMLReader.setContentHandler(myRSSHandler);
       InputSource myInputSource = new InputSource(rssUrl.openStream());
       myXMLReader.parse(myInputSource);

       result.setText(streamTitle);

      } catch (MalformedURLException e) {
       // TODO Auto-generated catch block
       e.printStackTrace();
       result.setText("Cannot connect RSS!");
      } catch (ParserConfigurationException e) {
       // TODO Auto-generated catch block
       e.printStackTrace();
       result.setText("Cannot connect RSS!");
      } catch (SAXException e) {
       // TODO Auto-generated catch block
       e.printStackTrace();
       result.setText("Cannot connect RSS!");
      } catch (IOException e) {
       // TODO Auto-generated catch block
       e.printStackTrace();
       result.setText("Cannot connect RSS!");
      }


       }

       private class RSSHandler extends DefaultHandler
       {
        final int stateUnknown = 0;
        final int stateTitle = 1;
        int state = stateUnknown;

        int numberOfTitle = 0;
        String strTitle = "";
        String strElement = "";

      @Override
      public void startDocument() throws SAXException {
       // TODO Auto-generated method stub
       strTitle = "Nyheder fra ";
      }

      @Override
      public void endDocument() throws SAXException {
       // TODO Auto-generated method stub
       strTitle += "";
       streamTitle = "" + strTitle;
      }

      @Override
      public void startElement(String uri, String localName, String qName,
        Attributes attributes) throws SAXException {
       // TODO Auto-generated method stub
       if (localName.equalsIgnoreCase("title"))
       {
        state = stateTitle;
        strElement = "";
        numberOfTitle++;
       }
       else
       {
        state = stateUnknown;
       }
      }

      @Override
      public void endElement(String uri, String localName, String qName)
        throws SAXException {
       // TODO Auto-generated method stub
       if (localName.equalsIgnoreCase("title"))
       {
        strTitle += strElement + "\n"+"\n";
       }
       state = stateUnknown;
      }

      @Override
      public void characters(char[] ch, int start, int length)
        throws SAXException {
       // TODO Auto-generated method stub
       String strCharacters = new String(ch, start, length);
       if (state == stateTitle)
       {
        strElement += strCharacters;
       }
      }
    }

}

最佳答案

当谈到用 Java 解析 XML 时,我从未真正使用过 SAX。我总是用 JDOM .它简单易用。

要使用 JDOM 读取 XML 文件,您可以创建一个文档并使用 InputStream 和 SAXBuilder 填充它:

SAXBuilder builder = new SAXBuilder();
Document document = builder.builder( myInputStream );

在您发布的案例中:myInputStream = url.openStream();

然后您需要获取 XML 文档的根:

Element root = document.getRootElement();

现在就很简单了。因为我不知道你得到的 XML 的结构,所以我假设它看起来像这样:

<rssfeed>
  <news>
    <title> Title </title>
    <description> Description </description>
  </news>
  <news>
    <title> ... </title>
    <description> ... </description>
  </news>
  <news>
    <title> ... </title>
    <description> ... </description>
  </news>
<rssfeed>

然后您可以像这样列出所有元素:

List<Element> news = root.getChildren( "news" );

然后在 for-each 循环中遍历列表,获取标题和描述(拥有一个数据类来保存这些信息会有所帮助,例如新闻类):

ArrayList<News> newsList = new ArrayList<News>();
for( Element child : news ) {
  News news = new News();
  news.setTitle( child.getChildText( "title" );
  news.setDescription( child.getChildText( "description" );
  newsList.add( news );
}

现在您有了一个可以随意使用的新闻列表。

关于Java-安卓。解析器问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7441558/

相关文章:

android - 关于 Android 查询库

java - 从java读取xml文件

java - Jaxb和内部元素的命名空间

android - 带有两个 float 操作按钮的 CoordinatorLayout

java - SERVER_ERROR : [code] 1675030 [message]: Error performing query

java - <jsp :forward> or <jsp:include> actions in a JSP needs buffering to be enabled?

java - 第一个参数类型错误

java - 如何使用计数器创建不同的 xml 标签?

java - maven:pom中多个配置文件的顺序

java - Android 闹钟管理器设置在特定时间重复