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

时间:2018-05-02 09:45:02

标签: flask lxml python-3.6

(更好的标题,任何人?)使用Python 3.6中的小型Flask应用程序渲染一些使用lxml.builder创建的XML。模块makeXML中的函数mkX构建并返回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>

查看返回XML的其他Web服务,浏览器不会省略XML标记,例如this one

这是否意味着myxml不是有效的XML?如果是这样,有什么区别&amp;我应该怎么解决?

2 个答案:

答案 0 :(得分:1)

浏览器呈现HTML,而不是XML。大多数浏览器试图显示文档中可能的内容。在您的情况下,它们向您显示所有文本节点,但不显示HTML中没有意义的XML元素。

检查HTTP响应是否包含一行

PlainText

只有设置了此选项,浏览器才能决定显示XML文档。

正如您在打开源视图时所看到的那样,XML已完成。一切都按照预期的方式运作。

答案 1 :(得分:1)

为了完整起见,除了Lutz Horn的回答之外,这是如何设置Flask返回特定的mimetype:

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

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