根据另一个问题,我可以用YQL查询选择单独的XML字段,当我测试它时,它运行得很好:
SELECT statistics.subscriberCount FROM xml
WHERE url='http://gdata.youtube.com/feeds/api/users/{$id}'
然而,当我尝试从Google的"非官方"天气XML API中选择单独的XML字段时,我总是得到空的结果(尽管SELECT *
确实有效)。
我知道我对XML和YQL的理解还不完全,但我缺少什么?(这是我在YQL控制台中的查询)
(我已经设法使用带有itemPath
参数和SELECT *
的XPATH查询它)
我的预期查询
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>
事实证明,Google weather API并没有什么特别之处,而是SELECT
参数与YQL查询中itemPath
参数的交互方式。
就我个人而言,对于那些对YQL所依赖的一些技术只有初步了解的人来说,我发现YQL文档很难使用。
似乎当你SELECT ... FROM rss
时,有一个隐含的itemPath
指向提要的重复item
字段。但是当您SELECT ... FROM xml
时,您需要手动指定一个itemPath
。如果您的XML中没有重复的部分,那么您将其设置为什么是非常随意的
现在,一旦设置了itemPath
,就可以使用点表示法SELECT
特定字段。请注意,您可以使用SELECT
点表示法指定作为XML属性的子字段,但不能使用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>