因此,我查看了http://weather.yahooapis.com/forecastrss?w=1103816&u=c以查看它返回的内容并得到以下输出...
<?xml version="1.0" encoding="UTF-8"?><rss xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:yweather="http://xml.weather.yahoo.com/ns/rss/1.0" version="2.0">
<channel>
<title>Yahoo! Weather - Melbourne, AU</title>
<link>http://us.rd.yahoo.com/dailynews/rss/weather/Melbourne__AU/*http://weather.yahoo.com/forecast/ASXX0075_c.html</link>
<description>Yahoo! Weather for Melbourne, AU</description>
<language>en-us</language>
<lastBuildDate>Sun, 02 Mar 2014 1:29 pm AEDT</lastBuildDate>
<ttl>60</ttl>
<yweather:location city="Melbourne" country="Australia" region="VIC"/>
<yweather:units distance="km" pressure="mb" speed="km/h" temperature="C"/>
<yweather:wind chill="21" direction="190" speed="19.31"/>
<yweather:atmosphere humidity="46" pressure="1015.92" rising="0" visibility="9.99"/>
<yweather:astronomy sunrise="7:03 am" sunset="7:57 pm"/>
<image>
<title>Yahoo! Weather</title>
<width>142</width>
<height>18</height>
<link>http://weather.yahoo.com</link>
<url>http://l.yimg.com/a/i/brand/purplelogo//uh/us/news-wea.gif</url>
</image>
<item>
<title>Conditions for Melbourne, AU at 1:29 pm AEDT</title>
<geo:lat>-37.87</geo:lat>
<geo:long>145.1</geo:long>
<link>http://us.rd.yahoo.com/dailynews/rss/weather/Melbourne__AU/*http://weather.yahoo.com/forecast/ASXX0075_c.html</link>
<pubDate>Sun, 02 Mar 2014 1:29 pm AEDT</pubDate>
<yweather:condition code="28" date="Sun, 02 Mar 2014 1:29 pm AEDT" temp="21" text="Mostly Cloudy"/>
<description><![CDATA[
<img src="http://l.yimg.com/a/i/us/we/52/28.gif"/><br />
<b>Current Conditions:</b><br />
Mostly Cloudy, 21 C<BR />
<BR /><b>Forecast:</b><BR />
Sun - AM Clouds/PM Sun. High: 22 Low: 12<br />
Mon - Partly Cloudy. High: 27 Low: 14<br />
Tue - Mostly Sunny. High: 32 Low: 19<br />
Wed - AM Light Rain. High: 21 Low: 12<br />
Thu - Partly Cloudy. High: 22 Low: 13<br />
<br />
<a href="http://us.rd.yahoo.com/dailynews/rss/weather/Melbourne__AU/*http://weather.yahoo.com/forecast/ASXX0075_c.html">Full Forecast at Yahoo! Weather</a><BR/><BR/>
(provided by <a href="http://www.weather.com" >The Weather Channel</a>)<br/>
]]></description>
<yweather:forecast code="30" date="2 Mar 2014" day="Sun" high="22" low="12" text="AM Clouds/PM Sun"/>
<yweather:forecast code="30" date="3 Mar 2014" day="Mon" high="27" low="14" text="Partly Cloudy"/>
<yweather:forecast code="34" date="4 Mar 2014" day="Tue" high="32" low="19" text="Mostly Sunny"/>
<yweather:forecast code="11" date="5 Mar 2014" day="Wed" high="21" low="12" text="AM Light Rain"/>
<yweather:forecast code="30" date="6 Mar 2014" day="Thu" high="22" low="13" text="Partly Cloudy"/>
<guid isPermaLink="false">ASXX0075_2014_03_06_7_00_AEDT</guid>
</item>
</channel>
</rss><!-- fan516.sports.gq1.yahoo.com Sun Mar 2 03:08:38 PST 2014 -->
绕到这里我心想,我什至无法尝试解析它,而不是当有可用的 API 不仅可以读取内容,还可以查询它时。
所以我写了这个快速测试......
它读取 RSS 提要,description
从路径中查找元素/rss/channel/item
,其中包含您所追求的信息。
然后我需要解析描述内容,因为它是 HTML 格式的,这样可以很容易地找到img
标签并将src
属性提取到图像中。
最后我显示了一个JOptionPane
显示图标...
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JOptionPane;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.xml.sax.SAXException;
public class YahooTest {
public static void main(String[] args) {
Document doc = null;
try {
URL url = new URL("http://weather.yahooapis.com/forecastrss?w=1103816&u=c");
Node descNode = getNodeFrom(url, "/rss/channel/item/description");
if (descNode != null) {
String desc = descNode.getTextContent();
System.out.println(desc);
desc = "<root>" + desc + "</root>";
Node imgSourceNode = getNodeFrom(desc, "/root/img[@src]");
if (imgSourceNode != null) {
String imgUrl = imgSourceNode.getAttributes().getNamedItem("src").getNodeValue();
BufferedImage img = ImageIO.read(new URL(imgUrl));
JOptionPane.showMessageDialog(
null,
"The Weather looks like...",
"Weather",
JOptionPane.PLAIN_MESSAGE,
new ImageIcon(img));
} else {
JOptionPane.showMessageDialog(null, "No image source found in description");
}
} else {
JOptionPane.showMessageDialog(null, "No description node found");
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
public static Node getNodeFrom(URL url, String query) throws IOException, SAXException, ParserConfigurationException, XPathExpressionException {
Node node = null;
InputStream is = null;
try {
is = url.openStream();
node = getNodeFrom(is, query);
} finally {
try {
is.close();
} catch (Exception e) {
}
}
return node;
}
public static Node getNodeFrom(String text, String query) throws IOException, SAXException, ParserConfigurationException, XPathExpressionException {
Node node = null;
InputStream is = null;
try {
is = new ByteArrayInputStream(text.getBytes());
node = getNodeFrom(is, query);
} finally {
try {
is.close();
} catch (Exception e) {
}
}
return node;
}
public static Node getNodeFrom(InputStream is, String query) throws ParserConfigurationException, SAXException, IOException, XPathExpressionException {
Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(is);
return getNodeFrom(doc, query);
}
public static Node getNodeFrom(Document doc, String query) throws XPathExpressionException {
return getNodeFrom(doc.getDocumentElement(), query);
}
public static Node getNodeFrom(Node node, String query) throws XPathExpressionException {
XPath xPath = XPathFactory.newInstance().newXPath();
XPathExpression xExp = xPath.compile(query);
return (Node) xExp.evaluate(node, XPathConstants.NODE);
}
}
我确实花了一些时间查看您的代码,但是您糟糕的变量命名选择使得几乎不可能弄清楚发生了什么......
查看http://docs.oracle.com/javase/tutorial/jaxp/,XPath工作原理和XPath 教程