2012-03-12 87 views
1

我有這個xml文件,我想獲取href字符串。從xml文件獲取鏈接

<asx version = "3.0"> 
    <Title>TITLE</Title> 
    <Author>http://www.domain.com</Author> 
    <Copyright>Copyright</Copyright> 
    <PARAM name="HTMLView" value="http://www.domain.com" /> 
    <MoreInfo href="http://www.domain.com" /> 
    <entry> 
     <ref href="http://145.765.343.09:8180" /> 
     <Title>Tile</Title> 
     <Author>http://www.domain.com</Author> 
    </entry> 
</asx> 

我已經創建了一個適配器,但我得到Nullpointer ...我在這裏做錯了什麼?

這是代碼:

basefeedparser.class

public class BaseFeedParser { 

    static String feedUrlString = "http://www.domain.com/listen.asx"; 

    // names of the XML tags 
    static final String ASX = "asx"; 
    static final String ENTRY = "entry"; 
    static final String REF = "ref"; 


    private final URL feedUrl;  

    protected BaseFeedParser(){ 
     try { 
      this.feedUrl = new URL(feedUrlString); 
     } catch (MalformedURLException e) { 
      throw new RuntimeException(e); 
     }   
    } 

    protected InputStream getInputStream() { 
     try { 
      return feedUrl.openConnection().getInputStream(); 
     } catch (IOException e) { 
      throw new RuntimeException(e); 
     } 
    } 

    public List<Message> parse() { 
     final Message currentMessage = new Message(); 
     RootElement root = new RootElement(ASX); 
     final List<Message> messages = new ArrayList<Message>(); 
     Element itemlist = root.getChild(ENTRY);   
     //Element item = itemlist.getChild(ENTRY); 
     itemlist.setEndElementListener(new EndElementListener(){ 
      public void end() { 
       messages.add(currentMessage.copy()); 
      } 
     }); 
     itemlist.getChild(REF).setEndTextElementListener(new EndTextElementListener(){ 
      public void end(String body) { 
       currentMessage.setEntry(body); 
      } 
     }); 

     try { 
      Xml.parse(this.getInputStream(), Xml.Encoding.UTF_8, root.getContentHandler()); 
     } catch (Exception e) { 
      throw new RuntimeException(e); 
     } 
     return messages; 
    } 
} 

message.class

公共類消息實現在可比{

private String entry; 
private String Link; 


public String getEntry() { 
    return entry; 
} 

public void setEntry(String entry) { 
    String imgg = entry.substring(entry.indexOf("<ref href=")); 
    String cleanUp = imgg.substring(0, imgg.indexOf(">")+1);//deixnei apo pou ksekina to keimeno 
    imgg = imgg.substring(imgg.indexOf("href=") + 5); 
    int indexOf = imgg.indexOf("\""); 
    if (indexOf==-1){ 
     indexOf = imgg.indexOf("\""); 
    } 
    imgg = imgg.substring(0, indexOf); 

    setLink(imgg); 

    this.entry = this.entry.replace(cleanUp, ""); } 



public void setLink(String Link) { 
    this.Link = Link; 
} 
/** 
* @return the Link 
*/ 
public String getLink() { 
    return Link; 
} 



public Message copy(){ 
    Message copy = new Message(); 
    copy.entry = entry; 
    copy.Link=Link; 
    return copy; 
} 

@Override 
public String toString() { 
    StringBuilder sb = new StringBuilder(); 
    sb.append("Entry: "); 
    sb.append(entry); 
    sb.append('\n'); 
    sb.append("Link: "); 
    sb.append(Link); 
    return sb.toString(); 
} 

@Override 
public int hashCode() { 
    final int prime = 31; 
    int result = 1; 
    result = prime * result 
      + ((entry == null) ? 0 : entry.hashCode()); 
    result = prime * result 
    + ((Link == null) ? 0 : Link.hashCode()); 

    return result; 
} 

@Override 
public boolean equals(Object obj) { 
    if (this == obj) 
     return true; 
    if (obj == null) 
     return false; 
    if (getClass() != obj.getClass()) 
     return false; 
    Message other = (Message) obj; 
    if (entry == null) { 
     if (other.entry != null) 
      return false; 
    } else if (!entry.equals(other.entry)) 
     return false; 
    if (Link == null) { 
     if (other.Link != null) 
      return false; 
    } else if (!Link.equals(other.Link)) 
     return false; 
    return true; 
} 

public int compareTo(Message another) { 
    if (another == null) return 1; 
    // sort descending, most recent first 
    return 0; 
} 

} 然後即時打印我的主類是ref標籤的鏈接:

for (Message msg : messages){ 

      au.add(msg.getLink()); 
      String print=au.toString(); 
      Toast.makeText(main.this, print, Toast.LENGTH_LONG).show(); 

} 

的logcat:

03-12 09:01:27.164: E/AndroidRuntime(7231): FATAL EXCEPTION: main 
03-12 09:01:27.164: E/AndroidRuntime(7231): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.app/com.example.app.main}: java.lang.NullPointerException 
03-12 09:01:27.164: E/AndroidRuntime(7231):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1956) 
03-12 09:01:27.164: E/AndroidRuntime(7231):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981) 
03-12 09:01:27.164: E/AndroidRuntime(7231):  at android.app.ActivityThread.access$600(ActivityThread.java:123) 
03-12 09:01:27.164: E/AndroidRuntime(7231):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147) 
03-12 09:01:27.164: E/AndroidRuntime(7231):  at android.os.Handler.dispatchMessage(Handler.java:99) 
03-12 09:01:27.164: E/AndroidRuntime(7231):  at android.os.Looper.loop(Looper.java:137) 
03-12 09:01:27.164: E/AndroidRuntime(7231):  at android.app.ActivityThread.main(ActivityThread.java:4424) 
03-12 09:01:27.164: E/AndroidRuntime(7231):  at java.lang.reflect.Method.invokeNative(Native Method) 
03-12 09:01:27.164: E/AndroidRuntime(7231):  at java.lang.reflect.Method.invoke(Method.java:511) 
03-12 09:01:27.164: E/AndroidRuntime(7231):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:787) 
03-12 09:01:27.164: E/AndroidRuntime(7231):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:554) 
03-12 09:01:27.164: E/AndroidRuntime(7231):  at dalvik.system.NativeStart.main(Native Method) 
03-12 09:01:27.164: E/AndroidRuntime(7231): Caused by: java.lang.NullPointerException 
03-12 09:01:27.164: E/AndroidRuntime(7231):  at com.example.app.main.onCreate(main.java:24) 
03-12 09:01:27.164: E/AndroidRuntime(7231):  at android.app.Activity.performCreate(Activity.java:4465) 
03-12 09:01:27.164: E/AndroidRuntime(7231):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049) 
03-12 09:01:27.164: E/AndroidRuntime(7231):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920) 
03-12 09:01:27.164: E/AndroidRuntime(7231):  ... 11 more 

線24:

for (Message msg : messages) 
+0

發佈您的logcat ... – 2012-03-12 07:07:02

+0

@Samir logcat發佈 – 2012-03-12 07:20:47

+0

您是否初始化消息? – 2012-03-12 07:22:24

回答

0

當你試圖覆蓋end()方法在endElementListener,

itemlist.getChild(REF).setEndTextElementListener(new EndTextElementListener(){ 
     public void end(String body) { 
      currentMessage.setEntry(body); 
     } 
    }); 

你正在改變原型,因此ju st定義了一個新的end()方法,在endElement事件發生時不會被調用。