【发布时间】: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->headers->set('Content-Type', 'application/xml; charset=utf-8'); 时,我得到纯 HTML。
那么我怎样才能创建一个可以被浏览器解析而没有问题的 xml 响应呢?
【问题讨论】:
-
您是否尝试过使用不同的字符集直接在 Chrome 中加载响应?我记得我在用 Symfony 创建 API 端点时也遇到过类似的问题,但那毕竟只是当时浏览器的问题。
-
您是否尝试过在响应中单独设置内容?例如
$response = new Response(); $response->setContent($this->render('MyBundle:Sitemap:sitemap.xml.twig',['slugArray' => $slugArray,'curDate' => $curDate])); $response->setCharset('charset=utf-8'); $response->setStatusCode(Response::HTTP_OK); $response->headers->set('Content-Type', 'application/xml'); $response->send(); -
@Rooneyl 我做了,但完全不影响结果
-
@ScalatronMotoroller 我试过了,但是 chrome 说页面是空的,即使当我检查源代码时,它也不是