Почему браузеры пропускают теги XML?

(Лучшее название, кто-нибудь?) Рендеринг некоторого 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? Если да, то в чем разница и как мне это исправить?

Новые приложения с использованием ChatGPT
Новые приложения с использованием ChatGPT
Я собираюсь вернуться к теме, которую уже освещал ранее, - чатгпт.
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Kubernetes - это портативная, расширяемая платформа с открытым исходным кодом для управления контейнерными рабочими нагрузками и сервисами, которая...
Другой маршрут в Flask Python
Другой маршрут в Flask Python
Flask - это фреймворк, который поддерживает веб-приложения. В этой статье я покажу, как мы можем использовать @app .route в flask, чтобы иметь другую...
0
0
39
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Браузер отображает 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', подробнее здесь.

Другие вопросы по теме