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

发布时间:2022-04-30 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了如何在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 DOM中找到元素的命名空间?全部内容,希望文章能够帮你解决如何在PHP DOM中找到元素的命名空间?所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。