将openStream与具有带下划线的子域的URL一起使用会在Android中返回ioexception。为什么?

时间:2011-03-27 01:24:23

标签: android xml rss

我有以下代码,这对于从Android中的网络获取xml文档非常标准(据我所知):

URL rssUrl = new URL("web_1.whatever.com");            
SAXParserFactory mySAXParserFactory = SAXParserFactory.newInstance();
SAXParser mySAXParser = mySAXParserFactory.newSAXParser();
XMLReader myXMLReader = mySAXParser.getXMLReader();
RSSHandler myRSSHandler = new RSSHandler();
myXMLReader.setContentHandler(myRSSHandler);
myXMLReader.parse(new InputSource(rssUrl.openStream()));

这适用于大多数情况。当我尝试从子域中具有下划线“_”的Web地址获取XML文档时出现问题,如:web_1.whatever.com。 openStream()显然不适用于其中包含下划线的URL。我对于我的生活没有找到任何关于此的文档,并希望找到一种方法来使其适用于带有下划线的URL。输入的URL来自托管XML文件的用户,并使他们在另一个域上托管XML文件是我不想让他们做的事情。我已经尝试了所有我能想到的东西,所以任何帮助都会受到极大的赞赏。

我得到的错误如下。

  

03-27 03:44:54.274:WARN / System.err(1051):java.io.IOException:索引0处主机名中的非法字符:web_1.whatever.com

     

03-27 03:44:54.274:WARN / System.err(1051):at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:874)

     

03-27 03:44:54.274:WARN / System.err(1051):at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:1152)

     

03-27 03:44:54.274:WARN / System.err(1051):at java.net.URL.openStream(URL.java:653)

有什么想法吗?或者有什么地方我可以看看openStream代码?

感谢。

2 个答案:

答案 0 :(得分:4)

有效的主机名不能包含下划线(“_”),所以你看到的是正确的行为。

经过一番搜索后,我发现MS主机名可能违反标准。我能想到的唯一选择是找到一个DNS解析器,它可以处理主机名中的下划线并直接使用IP地址。

答案 1 :(得分:0)

你应该使用:

InputStream in = Url.openConnection().getInputStream();
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
RssHandler handler = new RssHandler();
parser.parse(in, handler);