1

最初のアイテム

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

2番目のアイテム

<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>

「item」はxmlの要素です。最初のアイテムには「エンクロージャ」タグがありませんが、2番目のアイテムでは使用できます。私の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;

    }
4

3 に答える 3

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
}
于 2013-01-31T10:19:08.347 に答える
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;}
}
于 2013-01-31T09:56:35.627 に答える
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;

}
于 2013-01-31T13:55:08.557 に答える