为什么浏览器会省略 XML 标签?
Why do browsers omit XML tags?
(更好的标题,有人吗?)使用 Python 3.6 中的小型 Flask 应用渲染一些 lxml.builder
制作的 XML。模块 mkX
中的函数 makeXML
构建并 returns 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>
查看其他 return XML 的网络服务,浏览器不会省略 XML 标记,例如 this one。
这是否意味着 myxml 无效 XML?如果是这样,有什么区别以及我应该如何解决它?
浏览器呈现 HTML,而不是 XML。大多数浏览器都试图显示文档的可能性。在您的情况下,它们会向您显示所有文本节点,但不会显示在 HTML.
中没有意义的 XML 元素
检查 HTTP 响应是否包含一行
Content-Type: application/xml
只有设置了这个,浏览器才能决定显示XML文档。
正如您在打开源代码视图时看到的那样,XML 已完成。一切正常。
为了完整起见,除了 Lutz Horn 的回答之外,这是将 Flask 设置为 return 特定 mimetype 的方法:
...
from flask import Response
...
def getXML():
xml = mkX.makeXML()
return Response(xml, mimetype='application/xml')
由于 xml 是记录而非文本,因此 'application/xml' 优于 'text/xml',更多信息 here。
(更好的标题,有人吗?)使用 Python 3.6 中的小型 Flask 应用渲染一些 lxml.builder
制作的 XML。模块 mkX
中的函数 makeXML
构建并 returns 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>
查看其他 return XML 的网络服务,浏览器不会省略 XML 标记,例如 this one。
这是否意味着 myxml 无效 XML?如果是这样,有什么区别以及我应该如何解决它?
浏览器呈现 HTML,而不是 XML。大多数浏览器都试图显示文档的可能性。在您的情况下,它们会向您显示所有文本节点,但不会显示在 HTML.
中没有意义的 XML 元素检查 HTTP 响应是否包含一行
Content-Type: application/xml
只有设置了这个,浏览器才能决定显示XML文档。
正如您在打开源代码视图时看到的那样,XML 已完成。一切正常。
为了完整起见,除了 Lutz Horn 的回答之外,这是将 Flask 设置为 return 特定 mimetype 的方法:
...
from flask import Response
...
def getXML():
xml = mkX.makeXML()
return Response(xml, mimetype='application/xml')
由于 xml 是记录而非文本,因此 'application/xml' 优于 'text/xml',更多信息 here。