Разбор узла канала с использованием XmlPullParser
Я пытаюсь разобрать channel
узел из RSS-канала, но я продолжаю получать эту ошибку в 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();
}
2 ответа
Я сдался и в конечном итоге с помощью этого:
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;
Образец 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);
}