(Лучшее название, кто-нибудь?) Рендеринг некоторого XML, созданного с помощью lxml.builder
, с использованием небольшого приложения Flask на Python 3.6. Функция 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
Когда я перехожу к [myurl]/getXML
в Chrome или Firefox, я вижу следующее:
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, браузер не пропускает теги XML, например Вот этот.
Означает ли это, что myxml недействителен XML? Если да, то в чем разница и как мне это исправить?
Браузер отображает HTML, а не XML. Большинство браузеров пытаются показать, что возможно из документа. В вашем случае они показывают вам все текстовые узлы, но не элементы XML, которые не имеют значения в HTML.
Проверьте, есть ли в ответе HTTP строку с надписью
Content-Type: application/xml
Только если это установлено, браузер может решить отобразить XML-документ.
Как вы можете видеть, открыв исходный вид, XML готов. Все работает как положено.
Для полноты картины, в дополнение к ответу Лутца Хорна, вот как настроить Flask для возврата определенного mimetype:
...
from flask import Response
...
def getXML():
xml = mkX.makeXML()
return Response(xml, mimetype='application/xml')
Поскольку xml - это записи, а не текст, 'application / xml' предпочтительнее 'text / xml', подробнее здесь.