通过 XML 解析时保留 CDATA 部分
Keeping CDATA sections while parsing through XML
我正在尝试通过添加几个节点将现有 Xml 文件转换为另一个 xml 文件。但是当我解析我的原始 xml 文件并将其写入另一个 xml 文件时,它会从输出 xml 中删除所有 CDATA。我怎样才能避免它?
这是我的代码:
tree = ET.parse(r'inputData.xml')
root = tree.getroot()
c = ET.Element("c")
c.text = "3"
root.insert(1, c)
tree.write("outputData.xml")
这是我的输入 XML
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE Map[]>
<Map srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over" background-color="rgba(0, 0, 0, 0)" maximum-extent="-20037508.34,-20037508.34,20037508.34,20037508.34">
<Style filter-mode="first" name="boundary">
<Rule>
<PolygonSymbolizer fill="#000000" fill-opacity="1" />
</Rule>
</Style>
<Layer name="boundary" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
<StyleName>boundary</StyleName>
<Datasource>
<Parameter name="type"><![CDATA[postgis]]></Parameter>
<Parameter name="table"><![CDATA[("select * from tbl") as path]]></Parameter>
<Parameter name="key_field"><![CDATA[gid]]></Parameter>
<Parameter name="geometry_field"><![CDATA[geom]]></Parameter>
<Parameter name="extent_cache"><![CDATA[auto]]></Parameter>
<Parameter name="dbname"><![CDATA[centralized2]]></Parameter>
<Parameter name="host"><![CDATA[localhost]]></Parameter>
<Parameter name="port"><![CDATA[5433]]></Parameter>
<Parameter name="user"><![CDATA[postgres]]></Parameter>
<Parameter name="password"><![CDATA[mysecretpassword]]></Parameter>
</Datasource>
</Layer>
</Map>
创建新的 XML 所有 CDATA 都被删除。
如果您使用lxml,您可以指定一个保留CDATA的解析器:
import lxml.etree
file_name = r'inputData.xml'
parser = lxml.etree.XMLParser(strip_cdata=False)
tree = lxml.etree.parse(file_name, parser)
root = tree.getroot()
c = lxml.etree.Element("c")
c.text = "3"
root.insert(1, c)
tree.write("outputData.xml")
我正在尝试通过添加几个节点将现有 Xml 文件转换为另一个 xml 文件。但是当我解析我的原始 xml 文件并将其写入另一个 xml 文件时,它会从输出 xml 中删除所有 CDATA。我怎样才能避免它?
这是我的代码:
tree = ET.parse(r'inputData.xml')
root = tree.getroot()
c = ET.Element("c")
c.text = "3"
root.insert(1, c)
tree.write("outputData.xml")
这是我的输入 XML
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE Map[]>
<Map srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over" background-color="rgba(0, 0, 0, 0)" maximum-extent="-20037508.34,-20037508.34,20037508.34,20037508.34">
<Style filter-mode="first" name="boundary">
<Rule>
<PolygonSymbolizer fill="#000000" fill-opacity="1" />
</Rule>
</Style>
<Layer name="boundary" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
<StyleName>boundary</StyleName>
<Datasource>
<Parameter name="type"><![CDATA[postgis]]></Parameter>
<Parameter name="table"><![CDATA[("select * from tbl") as path]]></Parameter>
<Parameter name="key_field"><![CDATA[gid]]></Parameter>
<Parameter name="geometry_field"><![CDATA[geom]]></Parameter>
<Parameter name="extent_cache"><![CDATA[auto]]></Parameter>
<Parameter name="dbname"><![CDATA[centralized2]]></Parameter>
<Parameter name="host"><![CDATA[localhost]]></Parameter>
<Parameter name="port"><![CDATA[5433]]></Parameter>
<Parameter name="user"><![CDATA[postgres]]></Parameter>
<Parameter name="password"><![CDATA[mysecretpassword]]></Parameter>
</Datasource>
</Layer>
</Map>
创建新的 XML 所有 CDATA 都被删除。
如果您使用lxml,您可以指定一个保留CDATA的解析器:
import lxml.etree
file_name = r'inputData.xml'
parser = lxml.etree.XMLParser(strip_cdata=False)
tree = lxml.etree.parse(file_name, parser)
root = tree.getroot()
c = lxml.etree.Element("c")
c.text = "3"
root.insert(1, c)
tree.write("outputData.xml")