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

前端之家收集整理的这篇文章主要介绍了如何在PHP DOM中找到元素的命名空间?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
这听起来像一个非常容易回答的问题,但我无法让它工作.我正在运行 PHP 5.2.6.

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

@H_403_3@<?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不起作用: @H_403_3@$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

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

并为身体

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

或与上下文节点

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

我没有受过教育的假设是,在内部,HTML文档与真实文档不同.在内部libxml uses a different module to parse HTML和DOMDocument本身将具有不同的nodeType,因为您可以通过执行简单验证

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

13是XML_HTML_DOCUMENT_NODE.

猜你在找的PHP相关文章