这听起来像一个非常容易回答的问题,但我无法让它工作.我正在运行
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不起作用:
原文链接:https://www.f2er.com/php/240210.html$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