У меня проблема. Я хочу загрузить фрагмент HTML с пространствами имен в DOMDocument
.
<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()
пространства имен или метод 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);
Есть ли способ достичь того, чего я хочу? Я был бы очень рад за любые советы.
EDIT Я открыл запрос на расширение libxml2, чтобы предоставить возможность сохранять пространства имен в HTML: https://bugzilla.gnome.org/show_bug.cgi?id=711670