1

XML を SAX で解析しています。私が見たインターネットの例のようなコードを書きました.URLを取得してから、これを解析しました. これが私のコードです。

public class Urunler implements Serializable {

private String title;
private String description;

public Urunler(String title, String description) {
    this.title = title;
    this.description = description;
}

public Urunler() {
}

public String getTitle() {
    return title;
}

public void setTitle(String title) {
    this.title = title;
}

public String getDescription() {
    return description;
}

public void setDescription(String description) {
    this.description = description;
}

public String cevir() {
          StringBuffer sb = new StringBuffer();
          sb.append("Title:" + getTitle());
          sb.append(", ");
          sb.append("Description:" + getDescription());
          sb.append(".");
          return sb.toString();
   }
}

次に、解析用のハンドラーを作成しました。以下です。

public class UrunlerHandler extends DefaultHandler{

private Urunler urunler;
private String temp;
private ArrayList<Urunler> urunlerList= new ArrayList<Urunler>();

@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {

    temp = "";

    if(qName.equalsIgnoreCase("item")){  
        urunler = new Urunler();
    }

}

@Override
public void characters(char[] ch, int start, int length) throws SAXException {

    temp = new String(ch,start,length);
}

@Override
public void endElement(String uri, String localName, String qName) throws SAXException {

    if(qName.equalsIgnoreCase("item")){
        urunlerList.add(urunler);
    }else if(qName.equalsIgnoreCase("title")){
        urunler.setTitle(temp);
    }else if(qName.equalsIgnoreCase("description")) {
        urunler.setDescription(temp);
    }

}


public void readList(){
    Iterator<Urunler> it = urunlerList.iterator();
    while (it.hasNext()) {
        System.out.println(it.next().cevir());
    }
}

次に、 Main メソッドで次のように使用しました。

     try {
        SAXParserFactory spfac = SAXParserFactory.newInstance();

        SAXParser sp = spfac.newSAXParser();

        UrunlerHandler handler = new UrunlerHandler();

        URL geoLocationDetailXMLURL = new URL(url);
        URLConnection geoLocationDetailXMLURLConnection = geoLocationDetailXMLURL.openConnection();
        BufferedReader geoLeocationDetails = new BufferedReader(new InputStreamReader(geoLocationDetailXMLURLConnection.getInputStream(), "UTF-8"));
        InputSource inputSource = new InputSource(geoLeocationDetails);
        sp.parse(inputSource, handler);
        handler.readList();

    } catch (Exception e) {
        e.printStackTrace();
    }

エラーで見れません。しかし、NullPointerException というエラーが発生しています。URL は次のとおりです = " http://www.gold.com.tr/cok-sa ​​tanlar-rss/54109/0 "

4

3 に答える 3

0

問題は、要素に遭遇する前に、<title>要素の下にある要素に遭遇していることです。そのため、メソッドを呼び出そうとしても null のままです。<channel><item>urunlersetTitle

おそらくすべきことは、urunlerその値を設定しようとする前にそれが null ではないことを確認することです (Rogue が示唆しているように)。明らかに、<title>実際には興味のない要素があるからです。

于 2013-10-16T14:55:25.127 に答える
0

ハンドラー クラスで urunler が null であるため、(A) null が許可されているかどうかを null チェックするか、(B) null にならないようにクラス コンストラクターで urunler を定義する必要があります。

(ア)

// ...
if (urunler != null) {
    urunler.setTitle("foo");
}

(ロ)

private final Urunler urunler;

public UrunlerHanlder(String qName) {
    urunler = new Urunler();
}
于 2013-10-16T14:16:57.667 に答える