0

RDF フィード (Android パーサーの初心者) を解析しようとして、数日間完全に立ち往生しています。使用にもかかわらず:

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

ここで指定されているように、私のアイテムは CHANNEL ではなくルートから取得されるためです。とにかく、私は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;
    }
   }

私はもう試した

要素 item = root.getChild("RDF_NAMESPACE", ITEM); 要素 item = root.getChild("", ITEM); 要素 item = root.getChild(ITEM);

しかし、これらの 3 つのオプションは 0 メッセージを返します。どんな助けでも本当に大歓迎です。よろしくお願いします。

4

1 に答える 1

1

あなたの具体的な質問についてはお答えできませんが、私の一般的なアドバイスは次のとおりです。これを行わないでください。RDF を XML として解析しようとしないでください。

その特定の RDF 構文である RDF/XML は、確かに構文的には XML ですが、グラフ モデル (RDF) をツリー モデル (XML) に詰め込み、それをシリアライズした結果です。RDF/XML の構文解析にはあらゆる種類の代替案とエッジケースがあり、一般的な悪夢です。それはあなたの髪を引き裂くでしょう。

Javaでこれをやっているようです。 MRGは優れた軽量の Java RDF パーサーであり、私は過去にこれを使用して成功しました。

編集済み:同様の質問が以前に尋ねられたようです (XML ツールではなく RSS ツールについて具体的に尋ねています)。Java で RSS フィードを作成する方法を参照してください。. 解析する可能性のある唯一の RDF が RSS である場合、それは良い賭けのように見えますが、可能性をより十分に理解するために、もし私があなただったら、両方を評価します。

また、別々に、rdf:RDFあなたの例には2つの要素があるようです。それはカット アンド ペースト エラーですか、それともひどく不正な形式の RDFを扱っていますか?

于 2013-03-23T11:05:31.670 に答える