XPath em testes PHPUnit com Zend
-
13-11-2019 - |
Pergunta
Eu tenho este código aparentemente básico:
$docSrc =
'<?xml version="1.0" encoding="UTF-8" ?>
<html xmlns="http://www.w3.org/1999/xhtml">
<head><title /></head>
<body><p>Test paragraph.</p></body>
</html>';
$domDoc = new DOMDocument();
$domDoc->loadXML($docSrc);
$xpath = new DOMXPath($domDoc);
$nodeList = $xpath->query('//p');
$this->assertTrue($nodeList->length == 1);
Deveria ter sucesso, mas falha miseravelmente, o comprimento é 0.Fiquei o dia todo procurando uma solução, mas sem sucesso.
Uau, obrigado!Funciona!Infelizmente, meu código original:
$query = new Zend_Dom_Query($docSrc);
$xpathQuery = '//p';
$result = $query->queryXpath($xpathQuery);
$this->assertTrue($result->count() == 1);
pensa que é um XML e executa loadXML.Você tem alguma ideia de por que isso acontece?
Ok, encontrei o culpado em algum lugar da Biblioteca Zend:
if ('<' . '?xml' == substr(trim($document), 0, 5)) {
return $this->setDocumentXml($document, $encoding);
}
Gostaria de saber se isso está correto já que É um documento XML, mas carregar XML não funciona.
Ok, estou fazendo algumas pesquisas.Aparentemente, o problema tem algo a ver com namespaces...
Solução
Mude a linha 2 para:
$domDoc->loadHTML($docSrc);
Outras dicas
HÁ um bug, a solução alternativa é:
$docSrc =
'<?xml version="1.0" encoding="UTF-8" ?>
<html xmlns="http://www.w3.org/1999/xhtml">
<head><title /></head>
<body><p>Test paragraph.</p></body>
</html>';
$domDoc = new DOMDocument();
$domDoc->loadXML($docSrc);
$xpath = new DOMXPath($domDoc);
$xpath->registerNamespace('xhtml', 'http://www.w3.org/1999/xhtml');
$nodeList = $xpath->query('//xhtml:p');
$this->assertTrue($nodeList->length == 1);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow