我有一个XML文件,我想获取其中节点属性的值,它在节点通常时有效工作,但是节点的名称就像某个东西:它没有给我任何结果,只是null。 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 - Sunnyvale, CA</title>
<link>http://us.rd.yahoo.com/dailynews/rss/weather/Sunnyvale__CA/*http://weather.yahoo.com/forecast/USCA1116_f.html</link>
<description>Yahoo! Weather for Sunnyvale, CA</description>
<language>en-us</language>
<lastBuildDate>Fri, 18 Dec 2009 9:38 am PST</lastBuildDate>
<ttl>60</ttl>
<yweather:location city="Sunnyvale" region="CA" country="United States"/>
<yweather:units temperature="F" distance="mi" pressure="in" speed="mph"/>
</channel>
</rss>
Java代码:
XPathFactory factory = XPathFactory.newInstance();
XPath xpath = factory.newXPath();
XPathExpression expr = xpath.compile("//rss/@version");
Object result = expr.evaluate(doc, XPathConstants.STRING);
System.out.println(result);
以前的java代码可以有效地工作,但在用//rss/@version
替换时
//rss/channel/yweather:location/@city
它将我返回null。
答案 0 :(得分:3)
首先,在:之前的部分称为名称空间。这是XML中非常重要的概念。 要使用命名空间检索值,您必须使上下文知道命名空间。您可以使用
执行此操作xpath.setNamespaceContext(context);
context
必须是NamespaceContext的实现。在这种情况下,namspaces是在XML中定义的,所以最好有一个命名空间解析器,它可以直接从文档中获取命名空间。这个课正是这样做的:
public class UniversalNamespaceResolver implements NamespaceContext {
private Document sourceDocument;
public UniversalNamespaceResolver(Document document) {
sourceDocument = document;
}
public String getNamespaceURI(String prefix) {
if (prefix.equals(XMLConstants.DEFAULT_NS_PREFIX)) {
return sourceDocument.lookupNamespaceURI(null);
} else {
return sourceDocument.lookupNamespaceURI(prefix);
}
}
public String getPrefix(String namespaceURI) {
return sourceDocument.lookupPrefix(namespaceURI);
}
public Iterator getPrefixes(String namespaceURI) {
return null;
}
}
了解详情