我正在使用下面的功能,但不确定它是否始终稳定/安全......Is it?
何时以及谁可以稳定/安全地“重用 DOMXpath 准备过程的部分内容”?
为了简化使用XPath query() 方法我们可以采用一个用静态变量来记忆最后一次调用的函数,
function DOMXpath_reuser($file) {
static $doc=NULL;
static $docName='';
static $xp=NULL;
if (!$doc)
$doc = new DOMDocument();
if ($file!=$docName) {
$doc->loadHTMLFile($file);
$xp = NULL;
}
if (!$xp)
$xp = new DOMXpath($doc);
return $xp; // ??RETURNED VALUES ARE ALWAYS STABLE??
}
目前的问题类似于另一个关于XSLT处理器的重用。
在这两个问题中,问题都可以推广到使用 LibXML2 作为 DomDocument 实现的任何语言或框架。
还有另一个相关问题:如何“刷新”LibXML2 的 DOMDocument 实例?
插图
重用很常见(示例):
$f = "my_XML_file.xml";
$elements = DOMXpath_reuser($f)->query("//*[@id]");
// use elements to get information
$elements = DOMXpath_reuser($f)->("/html/body/div[1]");
// use elements to get information
但是,如果你做类似的事情removeChild
, replaceChild
等(示例),
$div = DOMXpath_reuser($f)->query("/html/body/div[1]")->item(0); //STABLE
$div->parentNode->removeChild($div); // CHANGES DOM
$elements = DOMXpath_reuser($f)->query("//div[@id]"); // INSTABLE! !!
可能会发生奇怪的事情,并且查询未按预期工作!
-
When(哪些 DOMDocument 方法影响 XPath?)
-
Why我们不能使用类似的东西规范化文档“刷新 DOM”(存在吗?)?
- 只有“new DOMXpath($doc);”总是安全的吗?还需要重新加载 $doc 吗?