Php Symfony 2使用Symfony\Component\domclawler\Crawler测试xml

Php Symfony 2使用Symfony\Component\domclawler\Crawler测试xml,php,xml,unit-testing,symfony,domcrawler,Php,Xml,Unit Testing,Symfony,Domcrawler,我有一个返回xml的url,但在提取“link”元素时遇到了一些问题 以下是我的测试: $crawler = $this->client->get('/my-feed'); $items = $crawler->filterXPath('//channel/item'); $this->assertGreaterThanOrEqual(1, $items->count()); // ok pass // ... $titles = $items->filt

我有一个返回xml的url,但在提取“link”元素时遇到了一些问题

以下是我的测试:

$crawler = $this->client->get('/my-feed');

$items = $crawler->filterXPath('//channel/item');
$this->assertGreaterThanOrEqual(1, $items->count()); // ok pass

// ...
$titles = $items->filterXPath('//title')->extract(array('_text'));
$this->assertContains("my title", $titles);  // ok pass


// ...
$links = $items->filterXPath('//link')->extract(array('_text'));
$this->assertContains("example.org", $links);  // KO!!! don't pass

var_dump($links); // empty string
“链接”是保留字?

您的XML已断开:

  • 您没有关闭频道节点
  • 您没有关闭的rss节点
  • 以下是更正后的XML:

    <rss xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
        <channel>
            <item>
                <id>123</id>
                <title>my title</title>
                <link>http://example.org</link>
            </item>
        </channel>
    </rss>
    

    你能看看
    $items->filterXPath('//link')
    包含什么吗?它返回一个crowler对象:
    code对象(Symfony\Component\domclawler\Crawler)#1968(5){[“uri”:protected]=>NULL[“defaultNamespacePrefix”:“Symfony\Component\domclawler\Crawler”:private]=>string(7)“default”[“namespaces”:“Symfony\Component\DomCrawler\Crawler:private]=>array(0){}[“baseHref”:“Symfony\Component\DomCrawler\Crawler:private]=>NULL[“存储”:“SplObjectStorage”:private]=>array(1){[[00000000 49A37B5B000000002DA5082F]=>array(2){[“obj”]=>object(doElement){1970(0)}[“inf”=>NULL}
    您的RSS xml代码是brokenYes,很抱歉我在复制粘贴代码中出错,xml是正确的,问题只出现在$items->filterXPath('//link')其他元素中works@Vega我试过使用我发布的xml并使用了
    [0]
    ,它对我很有效。你确定你的xml吗?什么是
    $this->client->getResponse()->getContent()
    在你得到(?@Vega很高兴听到这个消息!你现在可以接受答案:)
    $crawler = $this->client->get('/my-feed');
    
    $items = $crawler->filterXPath('//channel/item');
    $this->assertGreaterThanOrEqual(1, $items->count()); // ok pass
    
    // ...
    $titles = $items->filterXPath('//title')->extract(array('_text'));
    $this->assertContains("my title", $titles);  // ok pass
    
    
    // ...
    $links = $items->filterXPath('//link')->extract(array('_text'));
    $this->assertContains("example.org", $links);  // KO!!! don't pass
    
    var_dump($links); // empty string
    
    <rss xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
        <channel>
            <item>
                <id>123</id>
                <title>my title</title>
                <link>http://example.org</link>
            </item>
        </channel>
    </rss>
    
    $this->assertContains("my title", $titles[0]);
    // ...
    $this->assertContains("example.org", $links[0]);