【问题标题】:write the whole content of xml node without adding "xmlns="写入xml节点的全部内容而不添加“xmlns =”
【发布时间】:2016-04-09 05:53:27
【问题描述】:

从我的 xml 文件中,我想将每个子节点写入一个单独的文件。我为此使用xml.etree.ElementTree.tostring(child_node)。我已经发现我应该使用.register_namespace() 来避免在每个标签中添加“ns0:”。但是我仍然在我保存的每个节点中添加了“xmlns=”属性:

这里是示例 xml 文件:

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://earth.google.com/kml/2.1">
<Document>
 <name>ref.kml</name>
 <Style id="normalState">
    <IconStyle><scale>1.0</scale><Icon><href>yt.png</href></Icon></IconStyle>
    <BalloonStyle><text><![CDATA[$[description]]]></text></BalloonStyle>    
 </Style>
</Document>
</kml>

这是我的代码:

#!/usr/bin/env python

import xml.etree.ElementTree as ET

str_ns_url = 'http://earth.google.com/kml/2.1'
ET.register_namespace('', str_ns_url)

kml_file = ET.parse('my.kml')
kml_doc = kml_file.getroot()[0]

ndx = 0
for child in kml_doc:
    ndx+=1
    f = open('node'+str(ndx)+'.txt','w')
    f.write(ET.tostring(child))
    f.close()

这是第一个节点的输出 (&lt;name&gt;):

<name xmlns="http://earth.google.com/kml/2.1">ref.kml</name>

如您所见,xmlns= 已添加到标签中。到目前为止,我只找到了this SO post,它基本上建议在.tostring() 之后手动删除该子字符串。有没有更好的解决方案?也许我应该用别的东西代替ElementTree.tostring()

【问题讨论】:

    标签: python xml


    【解决方案1】:

    您需要考虑的是,源 XML 文档中的 &lt;name&gt; 元素在它从祖先元素 &lt;kml&gt; 继承的命名空间 http://earth.google.com/kml/2.1 中,而一个stand-没有命名空间声明的单独元素&lt;name&gt; 被视为在空命名空间中。当您尝试提取 &lt;name&gt; 元素并单独打印它时,XML 处理器将尝试通过在本地保留命名空间声明来避免更改元素的含义元素它自己。所以ElementTree.tostring() 在这里所做的确实是预期的行为。

    也就是说,如果您确实希望将命名空间更改为空,则可以重命名元素的 tag 属性,在调用 tostring() 之前删除命名空间:

    ns = "{http://earth.google.com/kml/2.1}"
    ......
    ......
    child.tag = child.tag.replace(ns, "")
    f.write(ET.tostring(child))
    

    如果要打印的元素有后代元素,你也需要对所有后代做同样的事情:

    for d in child.findall('.//*'):
        d.tag = d.tag.replace(ns, "")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-27
      • 2017-06-28
      • 2016-08-18
      • 1970-01-01
      • 2017-10-07
      相关资源
      最近更新 更多