2011-05-13 37 views
1

PHPUnit的测试中,我有这显然是基本代码:的XPath在与Zend

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

应该成功,但失败草草收场,长度为0,我一直整天寻找一个解决方案,但无济于事。


哇谢谢!有用!不幸的是,我的原始代码:

$query = new Zend_Dom_Query($docSrc); 
$xpathQuery = '//p'; 
$result = $query->queryXpath($xpathQuery); 
$this->assertTrue($result->count() == 1); 

认为它是一个XML并执行loadXML。你有什么想法为什么发生这种情况?


好吧,我发现罪魁祸首某处Zend库中:

if ('<' . '?xml' == substr(trim($document), 0, 5)) { 
    return $this->setDocumentXml($document, $encoding); 
} 

我不知道这是否是正确的,因为它是一个XML文件,但是加载XML不起作用。


好的,我正在做一些研究。显然,这个问题是与命名空间...

+1

无关建议:使用更具体assertEquals()等断言将产生更多的信息失败消息。以上就变成了'self :: assertEquals(1,$ result-> count());'所以失败会说“期望1但是3”而不是“期望真实但是错误”。 – 2011-05-14 00:19:58

回答

2

更改线路2:

$domDoc->loadHTML($docSrc); 
0

有一个bug,解决方法是:

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