0

sax パーサーを使用して xml ファイルを解析しています。xml ファイルには、次の属性を持つ link タグに別の xml ファイルへのリンクが含まれています。次の属性を持たない最後のxmlファイルまで読み続けなければなりません。xml ファイルは次のとおりです。

   <link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://gdata.youtube.com/feeds/api/videos/EokUNzGJBI8/comments" />
   <link rel="http://schemas.google.com/g/2005#batch" type="application/atom+xml" href="http://gdata.youtube.com/feeds/api/videos/EokUNzGJBI8/comments/batch" />
   <link rel="self" type="application/atom+xml" href="http://gdata.youtube.com/feeds/api/videos/EokUNzGJBI8/comments?start-index=1&amp;max-results=25" />
   <link rel="next" type="application/atom+xml" href="http://gdata.youtube.com/feeds/api/videos/EokUNzGJBI8/comments?start-index=26&amp;max-results=25" />

私は次のことを試しました:

SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser saxParser = factory.newSAXParser();
DefaultHandler handler = new DefaultHandler() {
boolean content=false;   
int i=0;
public void startElement(String uri, String localName,String qName, 
            Attributes attributes) throws SAXException {
    if (qName.equalsIgnoreCase("Content")) {
        content = true;
        i+=1;
    }
    if(qName.equalsIgnoreCase("Link") && attributes.getValue("rel").equalsIgnoreCase("next")){
        l=attributes.getValue("href");

        u=true;
    }   
}

上記で返された URL を再帰的に読み取るには、次のようにlします。

saxParser2.parse(new InputSource(ur.openStream()), handler);//to read original url
 while(l!=null)
 {
     urs=new URL(l); //successive urls
 saxParser.parse(new InputSource(urs.openStream()), handler);
 }

上記は、最後のxmlで次が見つからない後、最後の応答を出力し続けます。

4

1 に答える 1

0

編集:うーん、ごめんなさい、やっとあなたのコードを手に入れました。

実際、2 番目のループ (while) で parse を呼び出しているため、実際には再帰呼び出しを行っているわけではありません。これはより良いアイデアです。

したがって、DefaultHandler のサブクラスを作成し、'nextUrl' をこのクラスの属性にする必要があります。したがって、コードは次のとおりです。

public class MyHandler extends DefaultHandler {
    private String nextUrl;

    public void startElement(String uri, String localName,String qName, 
                Attributes attributes) throws SAXException {
        // (...)
        if(qName.equalsIgnoreCase("Link") && attributes.getValue("rel").equalsIgnoreCase("next")){
            nextUrl=attributes.getValue("href");
        }   
    }

    public String getNextUrl() { return nextUrl; }
}

次に、呼び出しコードで:

String url = "*firstUrl*"; //ur=initial xml link
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser saxParser = factory.newSAXParser();
MyHandler handler = new DefaultHandler()
while(url != null){
    saxParser.parse(new InputSource(url.openStream()), handler); 
    // Here, you'll certainly want to do something with the data loaded in handler...
    url = handler.getNextUrl();
 }
于 2013-03-08T08:02:29.213 に答える