使用 PHP 执行 XQuery

Posted

技术标签:

【中文标题】使用 PHP 执行 XQuery【英文标题】:Execute a XQuery with PHP 【发布时间】:2011-01-13 18:44:57 【问题描述】:

如何在php 中执行XQuery?可以举个例子吗?

谢谢。

【问题讨论】:

【参考方案1】:

PHP 没有任何支持 XQuery 的本机或通用 XML 解析器(如果我错了,请告诉我)。然而,它确实有两个非常标准的扩展来处理 XPath 查询。

我个人认为simplexml 是两者中的佼佼者。您只需使用:

$xml = new simplexml($some_xml_string);
$xpath_results = $xml -> Xpath("//a/b");

然后循环遍历结果。

扩展的 DOM 类也支持 Xpath 查询。在我看来,使用 DOM 的唯一真正优势是可以直接从较大的 XML 对象中修改或删除结果。

祝你好运。

【讨论】:

XPath 与 XQuery 不同。 我知道,对吧?这可能就是为什么我说的第一件事是 PHP 没有对 XQUERY 的原生支持。我想下一次,我不应该添加有用的替代解决方案。 我仍然不认为对于像这个 xpath 这样通用的问题是 xquery 的可行替代方案。至少它需要一些大的假设。但无论如何.... 很公平。基本上指向 XPath 只是为了让他们免去我使用 PHP 和 XML 的旅程,在那里我阅读了一些 XML 标准技术,感到兴奋,发现它在 PHP 中是某种支持的,并且即使那样也不是没有重新编译。 XQuery、XSLT、SOAP/WSDL、XPath 和我一起发生,我相信它会再次发生。不是讨厌 PHP,只是说 XML 会让人心碎,所有的承诺都是巨大的。 对此我完全同意。 “XML 就像暴力。如果它不能解决你的问题,你就没有充分利用它”。一方面,它被滥用得太频繁,另一方面,它经常与低于标准的工具一起使用。奇怪的是,这两种情况在同一个项目(或公司)中经常出现。 |并查找 abernier 的后续问题,似乎 xpath 成功了。【参考方案2】:

梨包:http://www.pecl.php.net/package/Zorba(错误404链接)

新(2011 年):http://www.zorba-xquery.com/html/entry/2011/12/27/PHP_Meets_XQuery

zorba 文档:http://www.zorba-xquery.com/

zorba 文档提供了一个简单的示例:

//Include for the Object-Oriented API
require ‘zorba_api.php’;

//Initialization of Zorba store
$store = InMemoryStore::getInstance();
//Initialization of Zorba
$zorba = Zorba::getInstance($store);

$xquery = <<< EOT
let $message := ‘Hello World!’
return
<results>
   <message>$message</message>
</results>
EOT;

//Compile the query
$lQuery = $zorba->compileQuery($xquery);
//Run the query…
echo $lQuery->execute();
//…and destroy it
$lQuery->destroy();

//Shutdown of Zorba
$zorba->shutdown();
//Shutdown of Zorba store
InMemoryStore::shutdown($store);

【讨论】:

与 Dominik (***.com/questions/2211743/…) 的评论相同。真的,没有比这更简单的了? That package no longer exists in PECL【参考方案3】:

使用 BaseX。它稳定、可扩展、快速! (但你需要一个服务器来运行)

BaseX clients

include("BaseXClient.php");

$session = new Session("localhost", 1984, "admin", "admin");
print $session->execute("xquery 1 to 10");
$session->close();

【讨论】:

【参考方案4】:

它也适用于 DOMDocument 和 DOMXPath

$doc = new DOMDocument();
$doc->load('http://www.example.com/some.xml');
$xpd = new DOMXPath($doc);
false&&$node = new DOMElement();//this is for my IDE to have intellysense

$result = $xpd->query('//a/b');
foreach($result as $node)
    echo $node->nodeName.'<br />';

【讨论】:

【参考方案5】:

http://phpxmlclasses.sourceforge.net/ 有这个页面,它有一个 XQuery Lite 类:

http://phpxmlclasses.sourceforge.net/show_doc.php?class=class_xquery_lite.html

Xquery Lite 1.0 语言的 PHP 实现,一种基于 Xquery 1.0 查询 XML 文档的语言 该类基于 DOM 扩展,允许对文件、php 字符串或组合中的 XML 文档执行 Xquery Lite 查询。

没用过,不知道效果如何。

【讨论】:

【参考方案6】:

以下链接应该很有用:http://dl.dropbox.com/u/1487285/php/php.html

<?php
require_once 'Zorba/XQueryProcessor.php'; 

$xquery = new XQueryProcessor(); 

$query = <<<'XQ'
  declare variable $world external; 
  <h1>Hello $world</h1>
XQ; 

$xquery->importQuery($query); 

$xquery->setVariable('world', 'World!'); 

echo $xquery->execute(); 
?>

【讨论】:

【参考方案7】:

对于共享主机方案,我建议使用 28msec (http://www.28msec.com) 之类的东西,它使您能够基于 Zorba XQuery 处理器构建 RESTful 服务。 从 PHP 你可以通过 REST 连接到 28 毫秒。

【讨论】:

【参考方案8】:

你看过http://www.pecl.php.net/package/Zorba吗?

【讨论】:

老兄!编译只是为了执行一个简单的查询?!听起来像是火箭科学……没有更简单的事了? That package no longer exists in PECL

以上是关于使用 PHP 执行 XQuery的主要内容,如果未能解决你的问题,请参考以下文章

使用 XPath 谓词优化 XQuery 查询

使用 JDBC 的 Xquery -- 错误的 SQL 语法

Xquery、Javascript 和 HTML

使用 XQuery 获取 XML 文件的文件名

使用 XPath/XQuery 过滤 XML 列上的 SQL 查询

如何在 Saxon 的 XQuery 中动态引用 XML 文件