【问题标题】:Symfony 2: Prevent header display in xml responseSymfony 2:防止在 xml 响应中显示标题
【发布时间】:2016-10-24 06:35:01
【问题描述】:

所以我正在尝试使用 symfony 创建一个 xml 文档。生成工作没有问题,我通过以下方式返回带有名为 sitemap.xml.twig 的树枝模板的文档:

<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
    {% for slug in slugArray %}
    <url>
        <loc>{{ slug }}</loc>
        <lastmod>{{ curDate }}</lastmod>
        <changefreq>monthly</changefreq>
        <priority>0.5</priority>
    </url>
    {% endfor %}
</urlset>

在控制器中,我调用模板:

    $response = new Response($this->render(
        'MyBundle:Sitemap:sitemap.xml.twig',
        [
            'slugArray' => $slugArray,
            'curDate' => $curDate
        ]
    ));

    $response->headers->set('Content-Type', 'application/xml; charset=utf-8');

    return $response;

$slugArray 包含大约 1000 个有效链接,而 $curDate 包含 date('Y-m-d', time()) 的值。

但是,当我尝试访问站点地图时,出现以下错误:

XML-Verarbeitungsfehler: nicht wohlgeformt
Adresse: http://localhost:8888/myWebsite/sitemap.xml
Zeile Nr. 1, Spalte 5:

HTTP/1.0 200 OK
----^

这基本上意味着xml文档格式不正确。

因此,由于某种原因,在解析 xml 时会考虑标头,从而产生错误。 xml 本身是完全有效的,当我从 Firefox 中的开发工具复制响应时,留下标题并使用在线验证器检查它们,我没有收到任何错误。

当我删除 $response-&gt;headers-&gt;set('Content-Type', 'application/xml; charset=utf-8'); 时,我得到纯 HTML。

那么我怎样才能创建一个可以被浏览器解析而没有问题的 xml 响应呢?

【问题讨论】:

  • 您是否尝试过使用不同的字符集直接在 Chrome 中加载响应?我记得我在用 Symfony 创建 API 端点时也遇到过类似的问题,但那毕竟只是当时浏览器的问题。
  • 您是否尝试过在响应中单独设置内容?例如$response = new Response(); $response-&gt;setContent($this-&gt;render('MyBundle:Sitemap:sitemap.xml.twig',['slugArray' =&gt; $slugArray,'curDate' =&gt; $curDate])); $response-&gt;setCharset('charset=utf-8'); $response-&gt;setStatusCode(Response::HTTP_OK); $response-&gt;headers-&gt;set('Content-Type', 'application/xml'); $response-&gt;send();
  • @Rooneyl 我做了,但完全不影响结果
  • @ScalatronMotoroller 我试过了,但是 chrome 说页面是空的,即使当我检查源代码时,它也不是

标签: php xml symfony


【解决方案1】:

如果您使用 twig 生成 xml 内容,在您的控制器中您已经得到响应。 在您的控制器中:

$response = $this->render('....:sitemap.xml.twig', array('urls'=>$urls));
// at this stage $xml is an HttpFoudation Response Object;
// simply set de content type
$response->headers->set('Content-Type', 'xml');
$response->setCharset('utf-8');
return $response;

【讨论】:

    猜你喜欢
    • 2021-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-14
    • 1970-01-01
    相关资源
    最近更新 更多