0

我正在使用 sax 解析器解析 xml 文件。该 xml 文件在带有下一个属性的链接标记中包含指向另一个 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

编辑:嗯,对不起,我终于得到了你的代码。

事实上,您并没有真正进行递归调用,因为您在第二个循环 (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 回答