通过Maven举例来说,这是几年前的一本书,但我认为,这是从存储库中检索正确的版本,我只是想知道第一次单元测试出了什么问题。示例
我们有一个xml文件,从它开始:
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<rss version="2.0" xmlns:yweather="http://xml.weather.yahoo.com/ns/rss/1.0" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#">
<channel>
<title>Yahoo! Weather - New York, NY</title>
<link>http://us.rd.yahoo.com/dailynews/rss/weather/New_York__NY/*http://weather.yahoo.com/forecast/10002_f.html</link>
<description>Yahoo! Weather for New York, NY</description>
<language>en-us</language>
<lastBuildDate>Sat, 10 Nov 2007 8:51 pm EDT</lastBuildDate>
<ttl>60</ttl>
<!--************ THIS IS THE LINE WE'RE INTERESTED IN ************ -->
<yweather:location city="New York" region="NY" country="US" />
<yweather:units temperature="F" distance="mi" pressure="in" speed="mph" />
并且正在通过InputStream读取此xml文件并进行解析:
Weather weather = new Weather();
log.info("Creating XML Reader");
SAXReader xmlReader = createXmlReader();
Document doc = xmlReader.read(inputStream);
// this proves we're getting the text OK
// String xml_text_content = doc.getStringValue();
// log.info( "=== xml text content: |" + xml_text_content + "|" );
log.info("Parsing XML Response");
weather.setCity(doc.valueOf("/rss/channel/y:location/@city"));
String city_str = doc.valueOf("/rss/channel/y:location/@city");
// this should say "New York"... but I'm getting an empty string
log.info( "=== doc value of for city: |" + city_str + "|" );
...我对RSS和XPath知之甚少,抱歉。看起来好像知识渊博的人可能会看到问题!
PS我试过改变&#34; yweather:location&#34;到&#34; y:location&#34;在xml文件中,然后&#34; y:location&#34;到&#34; yweather:location&#34;在代码中...都抛出异常。后一种情况:
528 INFO YahooParser - 解析XML响应测试运行:1,失败: 0,错误:1,跳过:0,经过的时间:0.096秒&lt;&lt;&lt;失败! testParser(org.sonatype.mavenbook.custom.weather.yahoo.YahooParserTest) 时间:0.094秒&lt;&lt;&lt; !ERROR
org.dom4j.XPathException: evaluting XPath发生异常:/ rss / channel / yweather:location / @ city。例外:XPath表达式使用未绑定的命名空间 前缀yweather
at org.dom4j.xpath.DefaultXPath.handleJaxenException(DefaultXPath.java:374) 在org.dom4j.xpath.DefaultXPath.valueOf(DefaultXPath.java:185) at org.dom4j.tree.AbstractNode.valueOf(AbstractNode.java:191) at org.sonatype.mavenbook.custom.weather.YahooParser.parse(YahooParser.j AVA:28) 在org.sonatype.mavenbook.custom.weather.yahoo.YahooParserTest.testParse R(YahooParserTest.java:36)
&#34;未绑定的名称空间前缀yweather&#34; ... ??? &LT;吞掉&GT;!
答案 0 :(得分:0)
以下代码适用于我:
import java.io.File;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.io.SAXReader;
public class TestSax {
public static void main(String[] args) throws DocumentException {
SAXReader xmlReader = new SAXReader();
Document doc = xmlReader.read(new File("D:/Temp/sax.xml"));
String city_str = doc.valueOf("/rss/channel/yweather:location/@city");
System.out.println( "=== doc value of for city: |" + city_str + "|" );
}
}
我从here获取了dom4j并需要jar jaxen。检查您是否使用相同的库。
另请注意,我已将代码y:location
更改为yweather:location
。
答案 1 :(得分:0)
只要放入解决方案(对我有用),以防同一本书的任何读者遇到同样的问题。
在第38页(在我的版本中) - 第4.3节和第34节;创建简单天气项目&#34;,我们被告知要运行此命令:
$ mvn archetype:generate -DgroupId = org.sonatype.mavenbook.custom DartifactId = simple-weather -Dversion = 1.0
在我的系统(Windows 7)上,这会创建错误的目录结构:在&#34; main&#34;并且在&#34;测试&#34;有一个&#34;虚假&#34;目录下&#34; mavenbook&#34;:&#34; custom&#34;。
在第43页上,当您开始创建&#34; main&#34;和&#34;测试&#34;目录结构,聪明的人比我更清楚这个&#34; custom&#34;目录不应该在那里......
我的解决方案(我最终得到的)确实是为了摆脱这个&#34; custom&#34;目录,确保路径在xxxxTest类的import语句中匹配OK,最后确保父pom.xml与目录&#34; simple-weather&#34;在同一目录中。 (项目pom.xml位于后一个目录中。)
也可以下载现成的项目(因为它的意思是,没有&#34; custom&#34;目录),正如书中所解释的那样......
PS我认为值得付出努力 - 如果您的建造者/测试者应用程序没有按预期工作,您从哪里开始?
PPS值得努力的是,Maven看起来设计得非常好,功能强大......
答案 2 :(得分:0)
回复旧帖只是想要知道解决方案的人(像我一样)我同意上面的自定义文件夹问题但是它错过了XPath问题的实际解决方案。
书已经
private SAXReader createXmlReader() {
Map<String,String> uris = new HashMap<String,String>();
uris.put( "y", "http://xml.weather.yahoo.com/ns/rss/1.0" );
将散列键更改为'yweather'并将Xpath更改为yweather:位置(代码,无论y:应该是yweather:....),如上所述,将在评论中使用
uris.put( "yweather", "http://xml.weather.yahoo.com/ns/rss/1.0" );