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 核心级别/版本是多少?的主要内容,如果未能解决你的问题,请参考以下文章

php DOMDocument 级别

关于DOM级别的一些问题,DOM0,DOM1,DOM2

DOM分类及HTML DOM

JS详细入门教程(上)

JavaScript基础

DOM的级别问题