【发布时间】:2013-11-30 17:07:45
【问题描述】:
我正在使用下面的功能,但不确定它是否总是稳定/安全... 是吗?
何时以及谁可以稳定/安全地“重用 DOMXpath 准备过程的部分内容”?
为了简化XPath query() method 的使用,我们可以采用一个函数,用静态变量记住最后一次调用,
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??
}
目前的问题类似于this other one 关于 XSLTProcessor 重用的问题。 在这两个问题中,问题都可以推广到使用 LibXML2 作为 DomDocument 实现的任何语言或框架。
还有一个相关问题:How to "refresh" DOMDocument instances of LibXML2?
说明
复用很常见(例子):
$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! !!
可能会发生异常情况,并且查询无法按预期工作!!
- 何时(哪些 DOMDocument 方法会影响 XPath?)
- 为什么我们不能使用 normalizeDocument 之类的东西来“刷新 DOM”(存在吗?)?
- 只有一个“新的 DOMXpath($doc);”总是安全的吗?还需要重新加载 $doc 吗?
【问题讨论】:
-
“只读”的意思是“稳定”吗?为什么会这样? DOMDocument 用于读取、修改和创建 XML 文档。
-
稳定为“按预期工作”、“没有错误”、“不出意外”。 DOMDocument 在创建或修改节点时没有属性说“DOM 映射丢失,必须刷新”:有些修改会影响 DOM,有些则不会。示例:在遍历 DOM 的循环中,
setAttribute方法没有问题,但一般replaceChild有问题。