【问题标题】:Parse channel node using XmlPullParser使用 XmlPullParser 解析通道节点
【发布时间】:2017-09-17 18:28:40
【问题描述】:

我正在尝试从 RSS 提要中解析 channel 节点,但我一直在 parser.nextText() 处收到此错误:

org.xmlpull.v1.XmlPullParserException: precondition: START_TAG (position:END_TAG </link>@3:449 in java.io.InputStreamReader@7988a7d) 

问题似乎是parser.getEventType() 是 3 (END_TAG),而应该是 2 (START_TAG)

饲料:

<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0">
    <channel>
        <title>Podcast Title</title>
        <link>http://www.link.com</link>
        <description>A description</description>

          <item>
          </item>

          <item>
          </item>

          <item>
          </item>

    </channel>
</rss>

代码:

    XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
    factory.setNamespaceAware(false);
    XmlPullParser parser = factory.newPullParser();
    InputStream stream = new URL(url).openConnection().getInputStream();
    parser.setInput(stream, "UTF-8");
    Boolean inChannel = false;

    int eventType = parser.getEventType();
    while (eventType != XmlPullParser.END_DOCUMENT) {
        String name;
        switch (eventType) {
            case XmlPullParser.START_DOCUMENT:
                break;
            case XmlPullParser.START_TAG:
                name = parser.getName();
                if (name.equalsIgnoreCase("channel"))
                    inChannel = true;
                else if (inChannel)
                {
                    channel = new ChannelItem();
                    if (name.equalsIgnoreCase("description"))
                        channel.setDescription(parser.nextText().trim());
                    else if (name.equalsIgnoreCase("media:thumbnail"))
                        channel.setThumnailUrl(parser.getAttributeValue(null, "url"));
                }
                break;
            case XmlPullParser.END_TAG:
                name = parser.getName();
                if (name.equalsIgnoreCase("channel"))
                    inChannel = false;
                break;
        }
        eventType = parser.next();
    }

【问题讨论】:

  • 代码在我的 IDE 中使用 parser.nextText() 运行良好,尽管对 getAttributeValue 的调用看起来错误
  • 有趣。我尝试了一切,但无法让它工作。我在下面发布的代码可以满足我的需要。

标签: android rss android-xmlpullparser


【解决方案1】:

我放弃了,最后用了这个:

  final ChannelItem channel = new ChannelItem();

    final RootElement root = new RootElement("rss");
    final Element channelNode = root.getChild("channel");


    channelNode.getChild("title").setEndTextElementListener(new EndTextElementListener()
    {
        public void end(final String body) {
            channel.setTitle(body);
        }
    });

    channelNode.getChild("link").setEndTextElementListener(new EndTextElementListener()
    {
        public void end(final String body) {
            channel.setSiteUrl(body);
        }
    });


    channelNode.getChild("description").setEndTextElementListener(new EndTextElementListener()
    {
        public void end(final String body) {
            channel.setDescription(body);
        }
    });

    try
    {
        InputStream stream = new URL(url).openConnection().getInputStream();

        Xml.parse(stream, Xml.Encoding.UTF_8, root.getContentHandler());
        stream.close();
    }
    catch (Exception e)
    {
    }
    return channel;

【讨论】:

    【解决方案2】:

    使用Jsoup解析XML

    Xml 示例

    <?xml version="1.0" encoding="UTF-8">
    <tests>
        <test>
            <id>xxx</id>
            <status>xxx</status>
        </test>
        <test>
            <id>xxx</id>
            <status>xxx</status>
        </test>
        ....
    </tests>
    

    代码示例

    String html = "<?xml version=\"1.0\" encoding=\"UTF-8\"><tests><test><id>xxx</id><status>xxx</status></test><test><id>xxx</id><status>xxx</status></test></tests></xml>";
    Document doc = Jsoup.parse(html, "", Parser.xmlParser())
    for (Element e : doc.select("test")) {
        System.out.println(e);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-21
      • 2013-02-10
      • 2016-12-21
      • 1970-01-01
      相关资源
      最近更新 更多