Синтаксический анализ ответа на XML-запрос Facebook - PullRequest
1 голос
/ 23 мая 2011

Эй, ребята! :) Я работаю над сервисом, который отслеживает количество лайков, публикаций и т. Д. В API Facebook. Но есть проблема, потому что я получаю исключение nullpointer из fqlResponse.getChild ().

По моему мнению, существует проблема с автоматическим определением типа документа xmls, поэтому я определил тип документа вручную, но проблема все еще существует. Может быть, xml доктайп Facebooks не правильный? Вот метод ловли:

public void refreshLikesSharesClicksAndTotal() throws JDOMException, IOException {
    URL fqlURL = new URL("https://api.facebook.com/method/fql.query?query=select  like_count,    total_count, share_count, click_count from link_stat where url=\"" + this.url.toString() + "\"");
    Document inputXML = new SAXBuilder().build(fqlURL);
    DocType docType = new DocType("xml", "http://www.w3.org/2001/XMLSchema-instance");
    inputXML.setDocType(docType);
    Element fqlResponse = inputXML.getRootElement().getChild("link_stat");
    Element likes = fqlResponse.getChild("like_count");
    logger.info("Likes: " + likes.getText());
    Element shares = fqlResponse.getChild("share_count");
    Element clicks = fqlResponse.getChild("click_count");
    Element total = fqlResponse.getChild("total_count");

    this.likes = Integer.parseInt(likes.getText());
    this.shares = Integer.parseInt(shares.getText());
    this.clicks = Integer.parseInt(clicks.getText());
    this.total = Integer.parseInt(total.getText());

}

Пример XML: https://api.facebook.com/method/fql.query?query=select%20%20like_count,%20total_count,%20share_count,%20click_count%20from%20link_stat%20where%20url=%22http://heise.de%22

Немецкое описание проблемы: http://www.java -forum.org / XML-со / 118648-проблемно-байм-parsen-facebook-xml.html

Спасибо за помощь! whitenexx

Ответы [ 2 ]

1 голос
/ 23 мая 2011

Вы можете сделать что-то вроде этого: -

    URL url = new URL("https://api.facebook.com/method/fql.query?query=select%20like_count,%20total_count,%20share_count,%20click_count%20from%20link_stat%20where%20url=%22http://heise.de%22");

    DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
    domFactory.setNamespaceAware(true);
    Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(url.openStream());
    XPath xPath = XPathFactory.newInstance().newXPath();

    int likeCount = Integer.parseInt(xPath.evaluate("//like_count/text()", doc));
    int totalCount = Integer.parseInt(xPath.evaluate("//total_count/text()", doc));
    int shareCount = Integer.parseInt(xPath.evaluate("//share_count/text()", doc));
    int clickCount = Integer.parseInt(xPath.evaluate("//click_count/text()", doc));

Убедитесь, что вы кодируете пробелы и двойные кавычки в URL с% 20 и% 22 соответственно.Я проверил этот код, и он работает для меня.

0 голосов
/ 24 мая 2011

Это работает для меня:

    public void refreshLikesSharesClicksAndTotal() throws JDOMException, IOException {
        URL fqlURL = new URL("https://api.facebook.com/method/fql.query?query=select%20like_count,%20total_count,%20share_count,%20click_count%20from%20link_stat%20where%20url=%22http://heise.de%22");
        URLConnection openConnection = fqlURL.openConnection();     
        String contentType = openConnection.getContentType();
        Document inputXML = new SAXBuilder().build(fqlURL);
        DocType docType = new DocType("xml", "http://www.w3.org/2001/XMLSchema-instance");
        inputXML.setDocType(docType);
        Element root = inputXML.getRootElement();

        Element fqlResponse = root.getChild("link_stat", root.getNamespace());
        Element likes = fqlResponse.getChild("like_count", root.getNamespace());
        Element shares = fqlResponse.getChild("share_count", root.getNamespace());
        Element clicks = fqlResponse.getChild("click_count", root.getNamespace());
        Element total = fqlResponse.getChild("total_count", root.getNamespace());

        int alikes = Integer.parseInt(likes.getText());
        int ashares = Integer.parseInt(shares.getText());
        int aclicks = Integer.parseInt(clicks.getText());
        int atotal = Integer.parseInt(total.getText());

    }

Я только что вставил «root.getNamespace ()» при вызове getChild и% 20 &% 22 в запросе

...