2013-01-31 71 views
1

第一項我該如何解析這個xml文件?

<item> 
<title>...</title> 
<link>...</link> 
<guid>...</guid> 
<description>...</description> 
<pubDate>Thu, 31 Jan 2013 13:46:24 +0530</pubDate> 
</item> 

第二項

<item> 
<title>...</title> 
<link>...</link> 
<guid>...</guid> 
<description>...</description> 
<enclosure url="http://entertainment.oneindia.in/img/2013/01/31-race-2-6-day-collection.jpg" type="image/jpeg" length="202500"/> 
<pubDate>Thu, 31 Jan 2013 10:36:35 +0530</pubDate> 
</item> 

「項」 是在一個XML的元素。第一個項目沒有「外殼」標籤,而在第二個項目中,它是可用的。我的DOMParser會拋出NPE,因爲它正在搜索的標籤「enclosure」在第一個「item」中不可用。首選標籤不可用時如何跳過?

我與NPE代碼

objItem.setImage(getAttributeVal("enclosure", eElement)); 



public String getAttributeVal(String tag,Element eElement) 
    { 

     String imgUrl=eElement.getElementsByTagName(tag).item(0).getAttributes().getNamedItem("url").getNodeValue(); 
     return imgUrl; 

    } 

回答

1

您當前的代碼不允許丟失情況下創建類。它總是假定它存在。

修改你的函數來檢查它是否存在。

public String getAttributeVal(String tag,Element eElement) 
{ 
    if (eElement.GetElementsByTagName(tag).Length > 0) // Or .Count > 0 
    { 
     String imgUrl=eElement.getElementsByTagName(tag).item(0).getAttributes().getNamedItem("url").getNodeValue(); 
     return imgUrl; 
    } 

    return ""; // Or null 
} 
0

你可以嘗試使用序列化,可以爲機箱

public class item 
{ 
    public enclosure enclosure{get;set} // it is null if no corresponding xml presented. 
} 

public class enclosure 
{ 
    public string url {get; set;} 
    public string type {get; set;} 
    public string length {get; set;} 
} 
0

您可以使用JAXB API:

import java.io.File; 
import javax.xml.bind.JAXBContext; 
import javax.xml.bind.JAXBException; 
import javax.xml.bind.Unmarshaller; 
import javax.xml.bind.annotation.XmlAccessType; 
import javax.xml.bind.annotation.XmlAccessorType; 
import javax.xml.bind.annotation.XmlAttribute; 
import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlRootElement; 



public static void main (String [] args) throws JAXBException { 

File file = new File("myfile.xml"); 
JAXBContext jaxbContext = JAXBContext.newInstance(MyItem.class); 
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); 

MyItem item = (MyItem) unmarshaller.unmarshal (file); 

String description = item.getDescription(); 
String guid = item.getGuid(); 
// ... 
} 


@XmlRootElement(name = "item") 
@XmlAccessorType(XmlAccessType.NONE) 
public static class MyItem { 

public MyItem() { 
    // FOR JAXB SERIALISATION 
} 

public String getTitle() { 
    return title; 
} 
public void setTitle (String title) { 
    this.title = title; 
} 
public String getLink() { 
    return link; 
} 
public void setLink (String link) { 
    this.link = link; 
} 
public String getGuid() { 
    return guid; 
} 
public void setGuid (String guid) { 
    this.guid = guid; 
} 
public String getDescription() { 
    return description; 
} 
public void setDescription (String description) { 
    this.description = description; 
} 
public MyEnclosre getEnclosure() { 
    return enclosure; 
} 
public void setEnclosure (MyEnclosre enclosure) { 
    this.enclosure = enclosure; 
} 
public String getPubDate() { 
    return pubDate; 
} 
public void setPubDate (String pubDate) { 
    this.pubDate = pubDate; 
} 

@XmlElement(name = "title") 
private String title; 

@XmlElement(name = "link") 
private String link; 

@XmlElement(name = "guid") 
private String guid; 

@XmlElement(name = "description") 
private String description; 

@XmlElement(name = "enclosure") 
private MyEnclosre enclosure; 

@XmlElement(name = "pubDate") 
private String pubDate; 

} 

public static class MyEnclosre { 

public MyEnclosre() { 
    // FOR JAXB SERIALISATION 
} 

public String getUrl() { 
    return myUrl; 
} 

public void setUrl (String url) { 
    this.myUrl = url; 
} 

@XmlAttribute (name = "url") 
private String myUrl; 

}