【问题标题】:Keeping CDATA sections while parsing through XML通过 XML 解析时保留 CDATA 部分
【发布时间】:2019-08-08 14:47:37
【问题描述】:

我正在尝试通过添加几个节点将现有 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&quot; background-color=&quot;rgba(0, 0, 0, 0)&quot; maximum-extent=&quot;-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 都会被删除。

【问题讨论】:

    标签: python xml elementtree cdata


    【解决方案1】:

    如果你使用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")
    

    【讨论】:

    • ElementTree 有什么解决方案吗?
    • 我不知道使用默认 xml 库的解决方案。 lxml.etreexml.etree.ElementTree 的替代品。另请参阅here
    • 您能否分享完整的解决方案,即在解析树中的特定位置添加新节点并将其写入另一个 xml 文件?
    • 添加和写入应该相同;您只需将 xml.etree.ElementTree 替换为 lxml.etree
    • 好的,我想通了。
    猜你喜欢
    • 1970-01-01
    • 2014-10-07
    • 1970-01-01
    • 1970-01-01
    • 2021-03-06
    • 2013-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多