1

我正在使用 SAX 解析 XML。我在我见过的 tje 互联网示例上编写了代码。我得到了 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 错误。这是网址 =“ http://www.gold.com.tr/cok-sa ​​tanlar-rss/54109/0 ”

4

3 回答 3

2

您用来学习 SAX 的资源是不好的示例,如果您想知道如何以正确的方式执行此操作,请参阅Oracle 教程(或查看对您先前问题的已接受答案的评论,这也指向一个好的教程)。

但是 SAX 对于您在这里想要的东西可能有点过分了,XPath 可能是一个更简单的解决方案。它更具声明性,并且陷阱更少。

这是一个名为 foobar.xml 的示例 XML 文件:

<?xml version="1.0"?>
<foo>
    <bar>hello</bar>
</foo>

我可以使用作为 Java SDK 一部分的 XPath API 来检索 bar 的元素文本,如下所示:

org.xml.sax.InputSource inputSource = new 
org.xml.sax.InputSource('c:/users/ndh/foobar.xml');
javax.xml.xpath.XPath xpath = 
    javax.xml.xpath.XPathFactory.newInstance().newXPath();
String text = (String)xpath.evaluate('/foo/bar/text()', 
    inputSource, javax.xml.xpath.XPathConstants.STRING);

字段文本将包含“hello”。

于 2013-10-16T15:27:32.757 回答
0

由于 urunler 在您的处理程序类中为空,因此您应该执行 (A) 空检查是否允许为空或 (B) 在类构造函数中定义 urunler 以使其不能为空:

(一个)

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

(乙)

private final Urunler urunler;

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

您的问题是您在遇到元素之前遇到了<title>元素下的元素。因此,当您尝试调用它的方法时,您的仍然为 null。<channel><item>urunlersetTitle

您可能应该做的是urunler在尝试设置该值之前检查该值是否为空(正如 Rogue 所建议的那样),因为显然有些<title>元素您实际上并不感兴趣。

于 2013-10-16T14:55:25.127 回答