如何在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是 (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
