如何在PHP DOM中找到元素的命名空间?

前端之家收集整理的这篇文章主要介绍了如何在PHP DOM中找到元素的命名空间?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
这听起来像一个非常容易回答的问题,但我无法让它工作.我正在运行 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()将其保存为字符串,然后使用正则表达式读取它.

编辑:

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

Like edorian already showed,使用loadXML加载标记时,获取命名空间工作正常.但你是对的,这对于加载了loadHTML的Markup不起作用:
$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;

并为身体

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本身将具有不同的nodeType,因为您可以通过执行简单验证

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

13是XML_HTML_DOCUMENT_NODE.

猜你在找的PHP相关文章