【问题标题】:Symfony 2 test xml with Symfony\Component\DomCrawler\CrawlerSymfony 2 使用 Symfony\Component\DomCrawler\Crawler 测试 xml
【发布时间】:2015-04-17 09:49:24
【问题描述】:

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

<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

“链接”是保留字?

【问题讨论】:

  • 你能看看$items-&gt;filterXPath('//link')包含什么吗?
  • 它返回一个crowler对象:code object(Symfony\Component\DomCrawler\Crawler)#1968 (5) { ["uri":protected]=&gt; NULL ["defaultNamespacePrefix":"Symfony\Component\DomCrawler\Crawler":private]=&gt; string(7) "default" ["namespaces":"Symfony\Component\DomCrawler\Crawler":private]=&gt; array(0) { } ["baseHref":"Symfony\Component\DomCrawler\Crawler":private]=&gt; NULL ["storage":"SplObjectStorage":private]=&gt; array(1) { ["0000000049a37b5b000000002da5082f"]=&gt; array(2) { ["obj"]=&gt; object(DOMElement)#1970 (0) { } ["inf"]=&gt; NULL } } }
  • 您的 RSS xml 代码已损坏

标签: php xml unit-testing symfony domcrawler


【解决方案1】:

您的 XML 已损坏:

  1. 您没有关闭通道节点&lt;/channel&gt;
  2. 你没有关闭 rss 节点&lt;/rss&gt;

这里是更正的 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>

然后,-&gt;extract() 返回提取值的数组。所以你不应该直接尝试查看它的包含,而是获取第一个元素并进行测试:

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

【讨论】:

  • 是的,对不起,我在复制粘贴代码时出错了,Xml 对 和 是正确的,问题仅在 $items->filterXPath('//link') 其他元素中作品
  • @Vega 我已经尝试使用我发布的 xml 并使用 [0] 并且它对我有用.. 你确定你的 xml 吗? $this-&gt;client-&gt;getResponse()-&gt;getContent() 在你的 -&gt;get( 之后说什么?
  • @Vega 很高兴听到这个消息!你现在可以接受答案了:)
猜你喜欢
  • 2014-08-06
  • 1970-01-01
  • 1970-01-01
  • 2017-01-11
  • 1970-01-01
  • 2016-01-21
  • 2014-11-08
  • 2012-10-18
  • 1970-01-01
相关资源
最近更新 更多