使用Play.libs中的XPath解析atom:XML中的链接字段
我正在Paly上开发一个web应用程序!框架 我必须解析XML文档。我正在使用Play.libs中的XPath 这是一段文档,我无法成功检索:使用Play.libs中的XPath解析atom:XML中的链接字段,xml,xpath,playframework,namespaces,atom-feed,Xml,Xpath,Playframework,Namespaces,Atom Feed,我正在Paly上开发一个web应用程序!框架 我必须解析XML文档。我正在使用Play.libs中的XPath 这是一段文档,我无法成功检索: <atom:link rel="self" href="http://mylink.com/"> 两者都失败并返回null 编辑: 我在网上发现这个问题可能来自DocumentBuilder(文档不知道名称空间)。但我没有构建它,它是Openstack计算API中的标准响应。这意味着我无法控制它的建造方式 如果要查看完整的xml文档,请执行
<atom:link rel="self" href="http://mylink.com/">
两者都失败并返回null
编辑:
我在网上发现这个问题可能来自DocumentBuilder(文档不知道名称空间)。但我没有构建它,它是Openstack计算API中的标准响应。这意味着我无法控制它的建造方式
如果要查看完整的xml文档,请执行以下操作:
编辑2:
看起来我有一个“不知道名称空间的问题”,有什么建议可以避免这个问题吗?请注意,XPath表达式是相对于上下文的,在您的例子中是文档节点。表达式选择文档的所有直接子元素(当然,没有任何元素)。您需要指定所需atom链接元素的完整路径,或者使用唯一标识该元素的谓词
"/os:servers/os:server[1]/atom:link[rel='self']"
将在第一个元素中选择rel=自包含的元素
更新:
如果没有名称空间问题
xmlDoc.getRootElement.getNamespaceURI()
应该返回null。在这种情况下,使用上面的bug报告中的测试代码就很容易了 对于那些有或将有相同问题的人,我在这里写下我选择的解决方案 由于问题来自文档生成器,并且getXml函数没有设置文档感知名称空间,因此必须替换该函数 代码来源: 而不是像这样检索DOM文档:
Document doc = WS.url("http://www.yoursource.com").get().getXml();
您应改为使用:
getXml(WS.url("http://www.yoursource.com").get(),"UTF-8");
您所指的文档是完整文档还是文档的一部分?它是文档的一部分。这是一个写得很好的XML文档,我无法控制。感谢您的回复。但我发现了一个错误:无法解析名称空间前缀“os”。看起来我必须创建一个新的名称空间。作为另一个hashmap?试图把“os”,“docs.openstack.org/compute/api/v1.1”);同样,如果没有成功对不起,名称空间当然应该以“http://”开头。(如何在没有干扰的情况下获得http ref显示?)。绑定应该放在同一个hashmap中。嗯,我想我对“os”也有同样的问题。尝试像这样选择servers节点:selectNodes(“/os:servers”,xmlDoc,namespace),结果返回null。(是的,我在同一个hashmap中添加了“os”绑定)好的,那么您可能会遇到“不知道名称空间的问题”,请参阅更新
public Document getXml(HttpResponse response, String encoding) {
try {
InputSource source = new InputSource(response.getStream());
source.setEncoding(encoding);
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
DocumentBuilder builder = factory.newDocumentBuilder();
builder.setEntityResolver(new NoOpEntityResolver());
return builder.parse(source);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
Document doc = WS.url("http://www.yoursource.com").get().getXml();
getXml(WS.url("http://www.yoursource.com").get(),"UTF-8");