Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Play.libs中的XPath解析atom:XML中的链接字段_Xml_Xpath_Playframework_Namespaces_Atom Feed - Fatal编程技术网

使用Play.libs中的XPath解析atom:XML中的链接字段

使用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文档,请执行

我正在Paly上开发一个web应用程序!框架 我必须解析XML文档。我正在使用Play.libs中的XPath

这是一段文档,我无法成功检索:

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