Выбор определенного поля в «неофициальном» API погоды Google с использованием YQL - PullRequest
0 голосов
/ 27 февраля 2012

По другому вопросу Я могу выбрать отдельные поля XML с помощью запроса YQL, и он отлично работает, когда я тестирую его:

SELECT statistics.subscriberCount FROM xml
WHERE url='http://gdata.youtube.com/feeds/api/users/{$id}'

Однако, когда я пытаюсь выбрать отдельные поля XML из API Google "неофициальная" погода XML Я всегда получаю пустые результаты (хотя SELECT * работает).

Я знаю, что мое понимание XML и YQL не полное, но чего мне не хватает? (Вот мой запрос в консоли YQL)

(мне удалось запросить его, используя XPATH с параметром itemPath и SELECT *)

Мой предполагаемый запрос

SELECT current_conditions FROM xml
WHERE url="http://www.google.com/ig/api?weather=Tbilisi"

Результаты

<?xml version="1.0" encoding="UTF-8"?>
<query xmlns:yahoo="http://www.yahooapis.com/v1/base.rng"
    yahoo:count="0" yahoo:created="2012-02-27T11:56:15Z" yahoo:lang="en-US">
    <results/>
</query>

Результаты SELECT *

<?xml version="1.0" encoding="UTF-8"?>
<query xmlns:yahoo="http://www.yahooapis.com/v1/base.rng"
    yahoo:count="1" yahoo:created="2012-02-27T11:57:18Z" yahoo:lang="en-US">
    <results>
        <xml_api_reply version="1">
            <weather mobile_row="0" mobile_zipped="1" module_id="0"
                row="0" section="0" tab_id="0">
                <forecast_information>
                    <city data="Tbilisi, Tbilisi"/>
                    <postal_code data="Tbilisi"/>
                    <latitude_e6 data=""/>
                    <longitude_e6 data=""/>
                    <forecast_date data="2012-02-27"/>
                    <current_date_time data="1970-01-01 00:00:00 +0000"/>
                    <unit_system data="US"/>
                </forecast_information>
                <current_conditions>
                    <condition data="Overcast"/>
                    <temp_f data="34"/>
                    <temp_c data="1"/>
                    <humidity data="Humidity: 80%"/>
                    <icon data="/ig/images/weather/cloudy.gif"/>
                    <wind_condition data="Wind: NE at 6 mph"/>
                </current_conditions>
                <forecast_conditions>
                    <day_of_week data="Mon"/>
                    <low data="28"/>
                    <high data="37"/>
                    <icon data="/ig/images/weather/mostly_sunny.gif"/>
                    <condition data="Mostly Sunny"/>
                </forecast_conditions>
                <forecast_conditions>
                    <day_of_week data="Tue"/>
                    <low data="30"/>
                    <high data="41"/>
                    <icon data="/ig/images/weather/mostly_sunny.gif"/>
                    <condition data="Mostly Sunny"/>
                </forecast_conditions>
                <forecast_conditions>
                    <day_of_week data="Wed"/>
                    <low data="30"/>
                    <high data="43"/>
                    <icon data="/ig/images/weather/mostly_sunny.gif"/>
                    <condition data="Mostly Sunny"/>
                </forecast_conditions>
                <forecast_conditions>
                    <day_of_week data="Thu"/>
                    <low data="27"/>
                    <high data="43"/>
                    <icon data="/ig/images/weather/mostly_sunny.gif"/>
                    <condition data="Partly Sunny"/>
                </forecast_conditions>
            </weather>
        </xml_api_reply>
    </results>
</query>

1 Ответ

0 голосов
/ 01 марта 2012

Оказывается, в API погоды Google нет ничего особенного, но в том, как параметр SELECT взаимодействует с параметром itemPath в YQL-запросе.

Лично я нахожу документацию по YQL довольно сложной для использования для тех из нас, кто имеет лишь элементарное понимание некоторых технологий, на которые она опирается.

Кажется, что, когда вы SELECT ... FROM rss, существует подразумеваемое itemPath, которое указывает на повторяющееся поле item канала. Но когда вы SELECT ... FROM xml вам нужно указать itemPath вручную. Если в вашем XML нет повторяющейся части, это довольно произвольно для того, чтобы вы установили его.

Теперь, когда у вас есть набор itemPath, вы можете SELECT определенные поля, используя точечную запись. Обратите внимание, что вы можете указать подполя, которые являются атрибутами XML, используя точечную нотацию SELECT, но вы не можете указать их, используя косую нотацию в itemPath, но никакая диагностика не поможет вам найти такую ​​ошибку новичка ...

Мой новый запрос

SELECT current_conditions.temp_c.data FROM xml
WHERE url="http://www.google.com/ig/api?weather=Tbilisi"
AND itemPath="//weather"

Результаты

<?xml version="1.0" encoding="UTF-8"?>
<query xmlns:yahoo="http://www.yahooapis.com/v1/base.rng"
    yahoo:count="1" yahoo:created="2012-03-01T10:22:41Z" yahoo:lang="en-US">
    <results>
        <weather>
            <current_conditions>
                <temp_c data="3"/>
            </current_conditions>
        </weather>
    </results>
</query>
...