【发布时间】:2013-11-20 06:46:33
【问题描述】:
我有问题。我想用DOMDocument 加载一个带有命名空间的HTML sn-p。
<div class="something-first">
<div class="something-child something-good another something-great">
<my:text value="huhu">
</div>
</div>
但我不知道如何保留命名空间。我尝试使用 loadHTML() 加载它,但 HTML 没有命名空间,因此它们被剥离了。
我尝试使用 loadXML() 加载它,但这也不起作用,因为 <my:text value="huhu"> 不是正确的 XML。
我需要的是不剥离命名空间的loadHTML() 方法或不验证标记的loadXML() 方法。所以这两种方法的组合。
到目前为止我的代码:
$html = '<div class="something-first">
<div class="something-child something-good another something-great">
<my:text value="huhu">
</div>
</div>';
libxml_use_internal_errors(true);
$domDoc = new DOMDocument();
$domDoc->formatOutput = false;
$domDoc->resolveExternals = false;
$domDoc->substituteEntities = false;
$domDoc->strictErrorChecking = false;
$domDoc->validateOnParse = false;
$domDoc->loadHTML($html/*, LIBXML_NOERROR | LIBXML_NOWARNING*/);
$xpath = new DOMXPath($domDoc);
$xpath->registerNamespace ( 'my', 'http://www.example.com/' );
// -----> This results in zero nodes cause namespace gets stripped by loadHTML()
$nodes = $xpath->query('//my:*');
var_dump($nodes);
有没有办法实现我想要的?如果有任何建议,我将非常高兴。
编辑我打开了一个对 libxml2 的增强请求,以提供在 HTML 中保留命名空间的选项:https://bugzilla.gnome.org/show_bug.cgi?id=711670
【问题讨论】:
-
在使用
loadXML或loadHTML时,加载既不是有效的XML 也不是有效的HTML 的东西总是很棘手... -
可以声明命名空间吗?像
<my:root_node xmlns:my="http://www.w3.org/TR/html4/">…<my:text>…这样的东西。 DOMDocument 在通过 loadXML() 或 load() 加载时应该能够处理命名空间。 -
已删除我的答案,因为它不符合您的需求。但也许它 - 可悲但真实 - 根本不起作用。绝对是一个有趣的问题.. +1
-
@jazZRo 不,它不会起作用,因为
<my:text value="huhu">不是有效的 XML :-(. -
@jazZRo 是的,这也是我在问我的问题。但是当只解析 HTML 的 sn-ps 时,例如
<div>,那么命名空间声明在该 sn 中不可用是很常见的-p