这听起来像是一个很容易回答的问题,但我一直无法让它发挥作用。我正在运行 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/