Symfony 2 тестирует xml с помощью Symfony \ Component \ DomCrawler \ Crawler

У меня есть URL, который возвращает 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>

Мне нужно проверить это с

Symfony\Component\DomCrawler\Crawler

Это мои тесты:

$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

«ссылка» является зарезервированным словом?

1

Решение

Ваш XML сломан:

  1. у вас нет узла закрытия канала </channel>
  2. у вас нет закрывающего узла rss </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>

Затем, ->extract() возвращается Массив извлеченных значений. Таким образом, вы не должны напрямую пытаться увидеть его содержимое, но получите первый элемент и выполните тест:

$this->assertContains("my title", $titles[0]);
// ...
$this->assertContains("example.org", $links[0]);
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]