为什么浏览器会省略 XML 标签?

Why do browsers omit XML tags?

(更好的标题,有人吗?)使用 Python 3.6 中的小型 Flask 应用渲染一些 lxml.builder 制作的 XML。模块 mkX 中的函数 makeXML 构建并 returns XML 像这样:

from lxml import etree as ET
...
def makeXML():
    ...
    # myxml is type <class 'lxml.etree._Element'>
    f = ET.tostring(myxml, method='xml', xml_declaration=True, encoding='utf-8', pretty_print=True)
    return f

其中 method=xml 可以省略,因为它是默认值。 Flask 应用程序:

@app.route('/getXML')
def getXML():
    xml = mkX.makeXML()    
    print(type(xml)) # xml is type <class 'bytes'>
    return xml    

当我在 Chrome 或 Firefox 中转到 [myurl]/getXML 时,我看到了:

eggs bacon sausage spam

它省略了 XML 标签。为什么会这样?点击查看源代码,我看到了这个:

<?xml version='1.0' encoding='utf-8'?>
<someXML>
  <reclist>
    <dat>eggs</dat>
    <dat>bacon</dat>
    <dat>sausage</dat>
    <dat>spam</dat>
  </reclist>
</someXML>

pretty_print=True 它的格式很好。没有它:

<?xml version='1.0' encoding='utf-8'?>
<someXML><reclist><dat>eggs</dat><dat>bacon</dat><dat>sausage</dat><dat>spam</dat></reclist></someXML>

查看其他 return XML 的网络服务,浏览器不会省略 XML 标记,例如 this one

这是否意味着 myxml 无效 XML?如果是这样,有什么区别以及我应该如何解决它?

浏览器呈现 HTML,而不是 XML。大多数浏览器都试图显示文档的可能性。在您的情况下,它们会向您显示所有文本节点,但不会显示在 HTML.

中没有意义的 XML 元素

检查 HTTP 响应是否包含一行

Content-Type: application/xml

只有设置了这个,浏览器才能决定显示XML文档。

正如您在打开源代码视图时看到的那样,XML 已完成。一切正常。

为了完整起见,除了 Lutz Horn 的回答之外,这是将 Flask 设置为 return 特定 mimetype 的方法:

...
from flask import Response
...
def getXML():
    xml = mkX.makeXML()    
    return Response(xml, mimetype='application/xml')

由于 xml 是记录而非文本,因此 'application/xml' 优于 'text/xml',更多信息 here