这个SAX解析和Xpath代码有什么问题?

时间:2015-05-31 19:28:22

标签: java xml xpath rss sax

通过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;!

3 个答案:

答案 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" );