2013-03-23 72 views
0

我试图解析RDF feed(Android解析器上的新手)时完全停留了几天。尽管使用:RDF feed的Android SAX解析器

Element item = root.getChild("", ITEM); 

,因为我的项目来自根,而不是渠道,任命here。无论如何,我只检索0的消息

<?xml version="1.0" encoding="utf-8" ?> 
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
    xmlns:dc="http://purl.org/dc/elements/1.1/" 
    xmlns:syn="http://purl.org/rss/1.0/modules/syndication/" 
    xmlns="http://purl.org/rss/1.0/"> 
<channel rdf:about="http://..."> 
    <title>Notícies</title> 
    <link>...</link> 
    <description></description> 
     <syn:updatePeriod>daily</syn:updatePeriod> 
     <syn:updateFrequency>1</syn:updateFrequency> 
     <syn:updateBase>2009-08-25T16:01:24Z</syn:updateBase> 
     <image rdf:resource="..."/> 
     <items> 
      <rdf:Seq> 
      <rdf:li rdf:resource="..."/> 
      <rdf:li rdf:resource="..."/> 
      </rdf:Seq> 
     </items> 
     </channel> 

<item rdf:about="...">   
    <title>...</title>   
    <link>....</link>   
    <description>...</description>   
    <dc:publisher>No publisher</dc:publisher> 
    <dc:creator>administrador</dc:creator> 
    <dc:rights></dc:rights>     
    <dc:date>2013-03-22T16:18:36Z</dc:date>   
    <dc:type>Noticia</dc:type>  
</item> 
<item rdf:about="...">   
    <title>...</title>   
    <link>....</link>   
    <description>...</description>   
    <dc:publisher>No publisher</dc:publisher> 
    <dc:creator>administrador</dc:creator> 
    <dc:rights></dc:rights>     
    <dc:date>2013-03-22T16:18:36Z</dc:date>   
    <dc:type>Noticia</dc:type>  
</item> 
<item rdf:about="...">   
    <title>...</title>   
    <link>....</link>   
    <description>...</description>   
    <dc:publisher>No publisher</dc:publisher> 
    <dc:creator>administrador</dc:creator> 
    <dc:rights></dc:rights>     
    <dc:date>2013-03-22T16:18:36Z</dc:date>   
    <dc:type>Noticia</dc:type>  
</item> 
... 

</rdf:RDF> 

使用我的SAX解析器如下:

public class AndroidSaxFeedParser extends BaseFeedParser { 


    static final String RDF_NAMESPACE = "http://www.w3.org/1999/02/22-rdf-syntax-ns#"; 
    static final String ATOM_NAMESPACE = "http://www.w3.org/2005/Atom"; 
    static final String RSS_NAMESPACE = ""; 

    static final String RSS = "RDF"; 
    public AndroidSaxFeedParser(String feedUrl) { 
     super(feedUrl); 
    } 

    public List<Message> parse() { 
     final Message currentMessage = new Message(); 
     //RootElement root = new RootElement(RSS); 
     RootElement root = new RootElement(RDF_NAMESPACE, RSS); 
     final List<Message> messages = new ArrayList<Message>(); 

     //Element channel = root.getChild(CHANNEL); 
     //Element channel = root.getChild(RDF_NAMESPACE, CHANNEL); 
     Log.e("Valor Root", root.toString()); 

     Element item = root.getChild("", ITEM); 
     //Element item = channel.getChild(RDF_NAMESPACE,ITEM); 
     item.setEndElementListener(new EndElementListener(){ 
      public void end() { 
       messages.add(currentMessage.copy()); 
      } 
     }); 
     item.getChild(TITLE).setEndTextElementListener(new EndTextElementListener(){ 
      public void end(String body) { 
       currentMessage.setTitle(body); 
      } 
     }); 
     item.getChild(LINK).setEndTextElementListener(new EndTextElementListener(){ 
      public void end(String body) { 
       currentMessage.setLink(body); 
      } 
     }); 
     item.getChild(DESCRIPTION).setEndTextElementListener(new EndTextElementListener(){ 
      public void end(String body) { 
       currentMessage.setDescription(body); 
      } 
     }); 
     item.getChild(PUB_DATE).setEndTextElementListener(new EndTextElementListener(){ 
      public void end(String body) { 
       currentMessage.setDate(body); 
      } 
     }); 
     try { 
      Xml.parse(this.getInputStream(), Xml.Encoding.UTF_8, root.getContentHandler()); 
     } catch (Exception e) { 
      throw new RuntimeException(e); 
     } 
     return messages; 
    } 
    } 

我已经试过

元素项= root.getChild( “RDF_NAMESPACE” ,ITEM); 元素item = root.getChild(“”,ITEM); Element item = root.getChild(ITEM);

但是,这3个选项返回0消息。 任何帮助将非常感激。提前谢谢了。

回答

1

我不能帮你解决具体的问题,但我的一般建议是:不要这样做 - 不要试图将RDF解析为XML。

RDF/XML语法确实在语法上是XML,但它是将图模型(RDF)填充到树模型(XML)中并将其序列化的结果。解析RDF/XML有各种各样的选择和边缘情况,是一个普通的噩梦;它会让你把你的头发撕掉。

它看起来像你在Java中这样做。 MRG是一个很好的,轻量级的Java RDF解析器,我过去成功地使用过它。

被修改:似乎有一个类似的问题之前已经问过(专门询问RSS工具而不是XML问题)。见How to write an RSS feed with Java?。如果你可能解析的唯一RDF是RSS,那么这看起来是一个很好的选择,但我会评估两者,如果我是你,只是为了更全面地了解可能性。

另外,你的例子中似乎有两个rdf:RDF元素。这是一个剪切和粘贴错误,或者你是否正在处理畸形的RDF?

+0

你是对的,在rss上有一个复制和粘贴错误。现在很好。那么,非常感谢你提出了一个新的解析器,我会看看它。 – indi 2013-03-23 11:38:26