php - 如何找出 PHP DOM 中元素的 namespace ?

标签 php dom domdocument xml-namespaces

这听起来像是一个很容易回答的问题,但我一直无法让它发挥作用。我正在运行 PHP 5.2.6。

我有一个 DOM 元素(根元素),当我转到 $element->saveXML() 时,它输出一个 xmlns 属性:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<html xmlns="http://www.w3.org/1999/xhtml" lang="en">
...

但是,我无法在 PHP 中找到任何以编程方式查看该命名空间的方法。我希望能够检查它是否存在以及它的设置。

检查 $document->documentElement->namespaceURI 将是显而易见的答案,但它是空的(我从来没有真正能够让它成为非空的)。什么在输出中生成该 xmlns 值,我如何读取它?

到目前为止,我能够做到这一点的唯一实用方法是完全破解 - 使用 saveXML() 将其作为 XML 保存到字符串,然后使用正则表达式读取它。

编辑:

这可能是使用 loadHTML() 而不是 loadXML() 加载 XML,然后使用 saveXML() 将其打印出来的一个特点。当您这样做时,似乎出于某种原因 saveXML 添加了一个 xmlns 属性,即使无法使用 DOM 方法检测此 xmlns 值是文档的一部分。我想这意味着如果我有办法检测传入的文档是否已使用 loadHTML() 加载,那么我可以用不同的方式解决这个问题。

最佳答案

Like edorian already showed ,当使用 loadXML 加载标记时,获取命名空间工作正常。但是你是对的,这对用 loadHTML 加载的标记不起作用:

$html = <<< XML
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:m="foo" lang="en">
    <body xmlns="foo">Bar</body>
</html>
XML;

$dom = new DOMDocument;
$dom->loadHTML($html);

var_dump($dom->documentElement->getAttribute("xmlns"));
var_dump($dom->documentElement->lookupNamespaceURI(NULL));
var_dump($dom->documentElement->namespaceURI);

将产生空结果。但是你可以使用 XPath

$xp = new DOMXPath($dom);
echo $xp->evaluate('string(@xmlns)');
// http://www.w3.org/1999/xhtml;

和 body

echo $xp->evaluate('string(body/@xmlns)'); // foo

或使用上下文节点

$body = $dom->documentElement->childNodes->item(0);
echo $xp->evaluate('string(@xmlns)', $body);
// foo

我没有受过教育的假设是,在内部,HTML 文档与真实 文档不同。内部libxml uses a different module to parse HTML并且 DOMDocument 本身将是不同的节点类型,因为您可以通过以下方式简单地验证

var_dump($dom->nodeType); // 13 with loadHTML, 9 with loadXml

13 是 XML_HTML_DOCUMENT_NODE .

关于php - 如何找出 PHP DOM 中元素的 namespace ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3566593/

相关文章:

php - 如何使用php domdocument回显节点的内容,包括html标签

PHP - 获取 XML 节点的值

php - CentOS 5.10 无法启用 php-openssl 扩展

javascript - 当涉及AJAX时,如何在加载页面的特定部分时运行JavaScript?

javascript - 加载异步属性的脚本会延迟 onload 事件吗?

angular - 构建 Angular 应用程序后,elementRef 为空

php DOMDocument 如何将节点值转换为字符串

php - HTML/PHP 表单问题

javascript - 在 PHP 中获取 HTML 元素

javascript - 我无法从 php 打开模式