Ahs*_*tar 3 python xml elementtree python-2.7
我正在尝试将此文本值写入 XML 标记,如下所示
<Parameter name="name"><![CDATA[xyzvalue]]></Parameter>
Run Code Online (Sandbox Code Playgroud)
每当我将此值设置为该标签的文本时。它像这样生成
<Parameter name="name"><![CDATA[xyzvalue]]></Parameter>
Run Code Online (Sandbox Code Playgroud)
我需要尝试避免代码中出现转义字符
ET.SubElement(parameters, "Parameter", name="id").text = unescape("<![CDATA[xyzvalue]]>")
Run Code Online (Sandbox Code Playgroud)
我怎样才能避免像这样写入 xml 文件?我需要避免在 XML 中转义字符。
这是我的完整代码:
map = ET.Element("Map")
parameters = ET.SubElement(map, "Parameters")
ET.SubElement(parameters, "Parameter", name="bounds").text = "-180,-85.05112877980659,180,85.05112877980659"
ET.SubElement(parameters, "Parameter", name="center").text = "0,0,2"
ET.SubElement(parameters, "Parameter", name="format").text = "png"
ET.SubElement(parameters, "Parameter", name="minzoom").text = "0"
ET.SubElement(parameters, "Parameter", name="maxzoom").text = "22"
ET.SubElement(parameters, "Parameter", name="scale").text = "1"
ET.SubElement(parameters, "Parameter", name="metatile").text = "2"
ET.SubElement(parameters, "Parameter", name="id").text = unescape("<![CDATA[xyzvalue]]>")
ET.SubElement(parameters, "Parameter", name="_updated").text = "1552288036000"
ET.SubElement(parameters, "Parameter", name="name").text = "<![CDATA[xyzvalue]]>"
ET.SubElement(parameters, "Parameter", name="tilejson").text = "<![CDATA[2.0.0]]>"
ET.SubElement(parameters, "Parameter", name="scheme").text = "<![CDATA[xyz]]>"
indent(map)
tree = ET.ElementTree(map)
tree.write("plotfinder_tiles.xml", xml_declaration=True, encoding='utf-8', method="xml")
Run Code Online (Sandbox Code Playgroud)
这与如何使用 ElementTree 输出 CDATA不同,在某种程度上,我在元素创建时遇到此问题,但在创建 xml 后不进行美化/删除。
如果是我,我会使用lxml 的CDATAclass。
但是,如果您想坚持使用 ElementTree,您可能可以重新定义ET._escape_cdata并确保文本在转义之前不以 开头<![CDATA[,也不以 结尾]]>。
例子...
Python 3.#
import xml.etree.ElementTree as ET
def escape_cdata(text):
# escape character data
try:
if not text.startswith("<![CDATA[") and not text.endswith("]]>"):
if "&" in text:
text = text.replace("&", "&")
if "<" in text:
text = text.replace("<", "<")
if ">" in text:
text = text.replace(">", ">")
return text
except (TypeError, AttributeError):
ET._raise_serialization_error(text)
ET._escape_cdata = escape_cdata
map_elem = ET.Element("Map")
parameters = ET.SubElement(map_elem, "Parameters")
ET.SubElement(parameters, "Parameter", name="bounds").text = "-180,-85.05112877980659,180,85.05112877980659"
ET.SubElement(parameters, "Parameter", name="center").text = "0,0,2"
ET.SubElement(parameters, "Parameter", name="format").text = "png"
ET.SubElement(parameters, "Parameter", name="minzoom").text = "0"
ET.SubElement(parameters, "Parameter", name="maxzoom").text = "22"
ET.SubElement(parameters, "Parameter", name="scale").text = "1"
ET.SubElement(parameters, "Parameter", name="metatile").text = "2"
ET.SubElement(parameters, "Parameter", name="id").text = "<![CDATA[xyzvalue]]>"
ET.SubElement(parameters, "Parameter", name="_updated").text = "1552288036000"
ET.SubElement(parameters, "Parameter", name="name").text = "<![CDATA[xyzvalue]]>"
ET.SubElement(parameters, "Parameter", name="tilejson").text = "<![CDATA[2.0.0]]>"
ET.SubElement(parameters, "Parameter", name="scheme").text = "<![CDATA[xyz]]>"
tree = ET.ElementTree(map_elem)
tree.write("test.xml", xml_declaration=True, encoding='utf-8', method="xml")
Run Code Online (Sandbox Code Playgroud)
XML 输出(test.xml;打印精美以提高可读性)
<Map>
<Parameters>
<Parameter name="bounds">-180,-85.05112877980659,180,85.05112877980659</Parameter>
<Parameter name="center">0,0,2</Parameter>
<Parameter name="format">png</Parameter>
<Parameter name="minzoom">0</Parameter>
<Parameter name="maxzoom">22</Parameter>
<Parameter name="scale">1</Parameter>
<Parameter name="metatile">2</Parameter>
<Parameter name="id"><![CDATA[xyzvalue]]></Parameter>
<Parameter name="_updated">1552288036000</Parameter>
<Parameter name="name"><![CDATA[xyzvalue]]></Parameter>
<Parameter name="tilejson"><![CDATA[2.0.0]]></Parameter>
<Parameter name="scheme"><![CDATA[xyz]]></Parameter>
</Parameters>
</Map>
Run Code Online (Sandbox Code Playgroud)
更新:Python 2.7 的函数
def escape_cdata(text, encoding):
# escape character data
try:
if not text.startswith("<![CDATA[") and not text.endswith("]]>"):
if "&" in text:
text = text.replace("&", "&")
if "<" in text:
text = text.replace("<", "<")
if ">" in text:
text = text.replace(">", ">")
return text.encode(encoding, "xmlcharrefreplace")
except (TypeError, AttributeError):
ET._raise_serialization_error(text)
Run Code Online (Sandbox Code Playgroud)