2013-03-08 80 views
0

我使用sax解析器解析xml文件。 xml文件包含鏈接標記中具有下一個屬性的另一個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上述回到我做的follwoing:

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中找不到下一個響應。

回答

0

編輯:嗯,對不起,我終於得到你的代碼。

事實上,你並不是真的在做遞歸調用,因爲你在第二個循環(while)中調用解析,這是一個更好的主意。

所以你應該創建一個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(); 
} 
+0

這意味着我可以循環這個saxParser2同時呼籲復位? – MaxSteel 2013-03-08 08:04:24

+0

@orabog基本上我想要做的就是讀取鏈接標籤中的rel =「next」的href,並解析它,直到最後一個沒有rel =「next」attrib的xml文件。 – MaxSteel 2013-03-08 08:07:36