Почему браузеры пропускают теги XML? - PullRequest
0 голосов
/ 02 мая 2018

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

Ответы [ 2 ]

0 голосов
/ 02 мая 2018

Для полноты, в дополнение к ответу Лутца Хорна, вот как настроить Flask для возврата определенного типа mime:

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

Поскольку xml - это записи, а не текст, «application / xml» предпочтительнее, чем «text / xml», больше информации здесь .

0 голосов
/ 02 мая 2018

Браузер отображает HTML, а не XML. Большинство браузеров пытаются показать, что возможно из документа. В вашем случае они показывают вам все текстовые узлы, но не элементы XML, которые не имеют значения в HTML.

Проверьте, содержит ли ответ HTTP строку «1003» *

Content-Type: application/xml

Только если этот параметр установлен, браузер может принять решение об отображении документа XML.

Как вы можете видеть, когда вы открываете исходное представление, XML завершен. Все работает как положено.

...