2014-05-06 298 views
0

终止我试图从任何新闻中显示文本报纸的类别。我使用本报的RSS。但是,当我运行代码时,有时候我会在上面得到异常消息,有时它会正常工作。这里是我的RSS解析器代码:XMLStreamException:[row,col]处的ParseError:[5,3]消息:元素类型“meta”必须以匹配结束标记“</meta>”

而且我使用RSS页面:

RSSFeedParser parser = new RSSFeedParser("http://www.cumhuriyet.com.tr/rss/5"); 
Feed feed = parser.readFeed(); 

的RSS解析器代码:

package main; 
import java.io.IOException; 
import java.io.InputStream; 
import java.net.MalformedURLException; 
import java.net.URL; 

import javax.xml.stream.XMLEventReader; 
import javax.xml.stream.XMLInputFactory; 
import javax.xml.stream.XMLStreamException; 
import javax.xml.stream.events.Characters; 
import javax.xml.stream.events.XMLEvent; 


public class RSSFeedParser { 
    static final String TITLE = "title"; 
    static final String DESCRIPTION = "description"; 
    static final String CHANNEL = "channel"; 
    static final String LANGUAGE = "language"; 
    static final String COPYRIGHT = "copyright"; 
    static final String LINK = "link"; 
    static final String AUTHOR = "author"; 
    static final String ITEM = "item"; 
    static final String PUB_DATE = "pubDate"; 
    static final String GUID = "guid"; 
    static final String IMG = "img"; 

    final URL url; 

    public RSSFeedParser(String feedUrl) { 
    try { 
     this.url = new URL(feedUrl); 
    } catch (MalformedURLException e) { 
     throw new RuntimeException(e); 
    } 
    } 

    public Feed readFeed() { 
    Feed feed = null; 
    try { 
     boolean isFeedHeader = true; 
     // Set header values intial to the empty string 
     String description = ""; 
     String title = ""; 
     String link = ""; 
     String language = ""; 
     String copyright = ""; 
     String author = ""; 
     String pubDate = ""; 
     String guid = ""; 
     String img = ""; 
     // First create a new XMLInputFactory 
     XMLInputFactory inputFactory = XMLInputFactory.newInstance(); 
     // Setup a new eventReader 
     InputStream in = read(); 
     XMLEventReader eventReader = inputFactory.createXMLEventReader(in); 
     // read the XML document 
     while (eventReader.hasNext()) { 
     XMLEvent event = eventReader.nextEvent(); 
     if (event.isStartElement()) { 
      String localPart = event.asStartElement().getName() 
       .getLocalPart(); 
      switch (localPart) { 
      case ITEM: 
      if (isFeedHeader) { 
       isFeedHeader = false; 
       feed = new Feed(title, link, description, language, 
        copyright, pubDate); 
      } 
      event = eventReader.nextEvent(); 
      break; 
      case TITLE: 
      title = getCharacterData(event, eventReader); 
      break; 
      case DESCRIPTION: 
      description = getCharacterData(event, eventReader); 
      break; 
      case LINK: 
      link = getCharacterData(event, eventReader); 
      break; 
      case GUID: 
      guid = getCharacterData(event, eventReader); 
      break; 
      case LANGUAGE: 
      language = getCharacterData(event, eventReader); 
      break; 
      case AUTHOR: 
      author = getCharacterData(event, eventReader); 
      break; 
      case PUB_DATE: 
      pubDate = getCharacterData(event, eventReader); 
      break; 
      case COPYRIGHT: 
      copyright = getCharacterData(event, eventReader); 
      break; 
      } 
     } else if (event.isEndElement()) { 
      if (event.asEndElement().getName().getLocalPart() == (ITEM)) { 
      FeedMessage message = new FeedMessage(); 

      message.setDescription(description); 
      message.setPubDate(pubDate); 
      message.setLink(link); 
      message.setTitle(title); 
      message.setImg(img); 
      feed.getMessages().add(message); 
      event = eventReader.nextEvent(); 
      continue; 
      } 
     } 
     } 
    } catch (XMLStreamException e) { 
     throw new RuntimeException(e); 
    } 
    return feed; 
    } 

    private String getCharacterData(XMLEvent event, XMLEventReader eventReader) 
     throws XMLStreamException { 
    String result = ""; 
    event = eventReader.nextEvent(); 
    if (event instanceof Characters) { 
     result = event.asCharacters().getData(); 
    } 
    return result; 
    } 

    private InputStream read() { 
    try { 
     return url.openStream(); 
    } catch (IOException e) { 
     throw new RuntimeException(e); 
    } 
    } 
} 

异常消息是:

Exception in thread "main" java.lang.RuntimeException: javax.xml.stream.XMLStreamException: ParseError at [row,col]:[5,3] 
Message: The element type "meta" must be terminated by the matching end-tag "</meta>". 
    at main.RSSFeedParser.readFeed(RSSFeedParser.java:112) 
    at cumhuriyet.Dunya.cumDunya(Dunya.java:32) 
    at automation.ServerInteraction.main(ServerInteraction.java:83) 
Caused by: javax.xml.stream.XMLStreamException: ParseError at [row,col]:[5,3] 
Message: The element type "meta" must be terminated by the matching end-tag "</meta>". 
    at com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl.next(Unknown Source) 
    at com.sun.xml.internal.stream.XMLEventReaderImpl.nextEvent(Unknown Source) 
    at main.RSSFeedParser.readFeed(RSSFeedParser.java:58) 
    ... 2 more 

回答

0

这看起来像一个活文件;即相当频繁改变的一个。它里面也没有标签的标志。

我能想到的两种解释正在发生的一切:

  1. 有时,正在产生或不正确地创建文档。

  2. 有时您会得到一个HTML错误页面而不是您期望的文档 ,而XML解析器无法应对HTML中的标记 。

要跟踪下来,你将不得不以捕获导致解析失败的精确输入。

+0

我写了上面的例外屏幕。 (我认为你的意思是在你的消息结束:)) –

+0

做一件事..打印XML你得到,看到这个XML,每当你得到异常。我相信它不是你的问题,这是服务问题,有些时候发送错误的XML作为回应.. – niiraj874u

+0

你是对的,它是关于服务 –

相关问题