PHP DOM 支持的 DOM 核心级别/版本是多少?
Posted
技术标签:
【中文标题】PHP DOM 支持的 DOM 核心级别/版本是多少?【英文标题】:What is the DOM Core Level / Version Supported by PHP DOM? 【发布时间】:2013-06-24 19:47:43 【问题描述】:php DOM 支持的 DOM Core 版本是什么?我可以看到有很多不同的列表,例如 (list):
Document Object Model (Core) Level 1(来自Document Object Model (DOM) Level 1 Specification) Document Object Model Core Level 2 Document Object Model Core Level 3支持哪一种?
【问题讨论】:
3v4l.org/hFG3R 【参考方案1】:PHP DOM 扩展具有Document Object Model (Core) Level 1 功能。您可以测试使用辅助方法实现的功能,然后测试功能和版本,这里总结了四个功能:
找到一个 Core 版本:'1.0'
。
找到四个 XML 版本:'2.0'; '1.0'; ''; NULL
。
找到零个 html 版本。
找到零个 XHTML 版本。
找到零个 XPath 版本。
如果不是深奥,这个结果与规格相结合是令人费解的。 Core Feature in Level 1.0 需要返回 TRUE
以及非指定版本(此处:对于 ''
和 NULL
),但结果显示,它没有。所以即使 DOM Core Level 1 被宣布为特性,它也被破坏了。
另外,the XML Feature can not be level 2.0 if 不支持 2.0 级的 Core 功能 - 这里就是这种情况,不 2.0 级的核心功能是受支持的。
DOM 中的功能 (source):
我的示例脚本的示例输出:
Core Feature is in PHP DOMDocument implementation:
1.) Core '3.0': FALSE
2.) Core '2.0': FALSE
3.) Core '1.0': TRUE
4.) Core '' : FALSE
5.) Core NULL : FALSE
One Core versions found: '1.0'.
XML Feature is in PHP DOMDocument implementation:
1.) XML '3.0': FALSE
2.) XML '2.0': TRUE
3.) XML '1.0': TRUE
4.) XML '' : TRUE
5.) XML NULL : TRUE
Four XML versions found: '2.0'; '1.0'; ''; NULL.
HTML Feature is in PHP DOMDocument implementation:
1.) HTML '3.0': FALSE
2.) HTML '2.0': FALSE
3.) HTML '1.0': FALSE
4.) HTML '' : FALSE
5.) HTML NULL : FALSE
Zero HTML versions found.
XHTML Feature is in PHP DOMDocument implementation:
1.) XHTML '3.0': FALSE
2.) XHTML '2.0': FALSE
3.) XHTML '1.0': FALSE
4.) XHTML '' : FALSE
5.) XHTML NULL : FALSE
Zero XHTML versions found.
XPath Feature is in PHP DOMDocument implementation:
1.) XPath '3.0': FALSE
2.) XPath '2.0': FALSE
3.) XPath '1.0': FALSE
4.) XPath '' : FALSE
5.) XPath NULL : FALSE
Zero XPath versions found.
示例脚本:
<?php
/**
* What is the DOM Core Version is Supported by PHP DOM?
* @link http://***.com/a/17340953/367456
*/
$dom = new DOMDocument();
$dom->loadXML('<root/>');
$versionsArray = ['3.0', '2.0', '1.0', '', NULL];
$features = [
# Document Object Model (DOM) <http://www.w3.org/DOM/DOMTR>
'Core' => $versionsArray,
# Document Object Model (DOM) <http://www.w3.org/DOM/DOMTR>
'XML' => $versionsArray,
# Document Object Model (DOM) Level 2 HTML Specification <http://www.w3.org/TR/DOM-Level-2-HTML/>
'HTML' => $versionsArray,
'XHTML' => $versionsArray,
# Document Object Model XPath <http://www.w3.org/TR/DOM-Level-3-XPath/xpath.html>
"XPath" => $versionsArray,
];
const DISPLAY_TITLE = 1;
const DISPLAY_DETAILS = 2;
const DISPLAY_SUMMARY = 4;
const DISPLAY_ALL = 7;
dom_list_features($dom, $features);
function dom_list_features(DOMDocument $dom, array $features, $display = DISPLAY_ALL)
foreach ($features as $feature => $versions)
dom_list_feature($dom, $feature, $versions, $display);
function dom_list_feature(DOMDocument $dom, $feature, array $versions, $display)
if ($display & DISPLAY_TITLE)
echo "$feature Feature is in PHP DOMDocument implementation:\n\n";
$found = [];
foreach ($versions as $i => $version)
$result = $dom->implementation->hasFeature($feature, $version);
if ($result)
$found[] = $version;
if ($display & DISPLAY_DETAILS)
printf(" %d.) $feature %' -5s: %s\n", $i + 1, var_export($version, true), $result ? 'TRUE' : 'FALSE');
if ($display & DISPLAY_DETAILS)
echo "\n";
$formatter = new NumberFormatter('en_UK', NumberFormatter::SPELLOUT);
$count = ucfirst($formatter->format(count($found)));
$found = array_map(function ($v)
return var_export($v, TRUE);
, $found);
if ($display & DISPLAY_SUMMARY)
printf("%s %s versions found%s.\n\n", $count, $feature, $found ? ': ' . implode('; ', $found) : '');
【讨论】:
回到这里是因为我的帖子被投票了。我看你的真的很不错。隐藏的宝藏之一。 :) 不幸的是,我已经对此投了赞成票。(尽管我必须承认,我个人认为不应该回答他自己的问题。我会改为写博客) 嗯,我也写博客,确实,这将是一个合适的选择。不过,我也认为在 *** 上使用它是有价值的,我喜欢问答风格,所以把它放在这里 :) 也许有一天我会写一篇关于 PHP 的 DOMDocument 的七个秘密 或什么的博客文章不是:) 是的,这一次很好,这是毫无疑问的。现在将在您的博客页面上阅读一些文章...(并在此期间喝啤酒:P)【参考方案2】:dom 核心版本取决于 PHP 所链接的 libxml2 版本。您甚至可以在底层替换库的二进制版本,而无需重新编译 php。 (我知道这有点自以为是,但一旦我这样做了,因为 libxml2 的 debian lenny 版本有一个错误)
对于 PHP @hakre 的答案中此功能的运行时检测是一个不错的 sn-p
【讨论】:
说到libxml,它支持哪些特性? ;) - (我认为它仍然如上所述,在 libxml 版本之间没有改变) 不懂问题 我认为替换libxml在这里并没有太大变化。它是 DOM Level-1,仅此而已。这也取决于 PHP 扩展提供的对象包装器。它基于 libxml,但它在 PHP 的 DOḾDocument 中仍然是自己的对象接口,所以我不确定你的答案是否准确。在任何情况下,编写那些不同的 libxml 版本支持的功能都会增加一些价值。 是的,当然,我和你在一起,我不想说相反的话。通过替换 lib 来升级整个 DOM 核心版本是不可能的,因为这也需要调整 PHP 扩展。小错误修正是可能的。只是想指出 PHP 没有它自己的 DOM 实现。它与 libxml2 链接,并具有与 PHP 链接的库版本相同的功能集。因此,在查看功能时,我之前通常会查看 libxml2。但是上面的运行时检测脚本很好.. 我不得不承认,dom扩展的代码量很大。必须深入挖掘才能肯定地说:this 工作由扩展完成,而 this 工作由libxml2
完成以上是关于PHP DOM 支持的 DOM 核心级别/版本是多少?的主要内容,如果未能解决你的问题,请参考以下文章