(更好的标题,任何人?)使用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;我应该怎么解决?
答案 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。