gpt4 book ai didi

php - 如何找出 PHP DOM 中元素的 namespace ?

转载 作者:可可西里 更新时间:2023-11-01 13:16:57 24 4
gpt4 key购买 nike

这听起来像是一个很容易回答的问题,但我一直无法让它发挥作用。我正在运行 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() 将其作为 XML 保存到字符串,然后使用正则表达式读取它。

编辑:

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

最佳答案

Like edorian already showed ,当使用 loadXML 加载标记时,获取命名空间工作正常。但是你是对的,这对用 loadHTML 加载的标记不起作用:

$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;

和 body

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 本身将是不同的节点类型,因为您可以通过以下方式简单地验证

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

13 是 XML_HTML_DOCUMENT_NODE .

关于php - 如何找出 PHP DOM 中元素的 namespace ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3566593/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com