【问题标题】:Edit XML with python使用 python 编辑 XML
【发布时间】:2015-04-01 05:20:38
【问题描述】:

我正在尝试解析一个 xml 文件,我想在该文件中获取 objlocation 的字符串并更改字符串的内容。

这是我拥有的 xml 文件的内容:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<publish show="STATE">

    <pubgroup objtype="ELE" location="/user_data/STATE/ITEM/character/ANM/ANM_rig_WALK_sg_v001/ANM_rig_WALK_sg_v001.xml">

        <member objidx="15283942" objlabel="anm" objlocation="/user_data/STATE/ITEM/character/ANM/ANM_rig_WALK_sg_v001/ANM_rig_WALK_sg_v001.anm"/>

        <member objidx="15283952" objlabel="fbx" objlocation="/user_data/STATE/ITEM/character/ANM/ANM_rig_WALK_sg_v001/ANM_rig_WALK_sg_v001_M_WALK_None.fbx"/>

        <member objidx="15283962" objlabel="mov" objlocation="/user_data/STATE/ITEM/character/ANM/ANM_rig_WALK_sg_v001/ANM_rig_WALK_sg_v001.mov"/>

        <member objidx="15283972" objlabel="libraryinfo" objlocation="/user_data/STATE/ITEM/character/ANM/ANM_rig_WALK_sg_v001/ANM_rig_WALK_sg_v001.json"/>

        <member objidx="15283982" objlabel="thumbnail" objlocation="/user_data/STATE/ITEM/character/ANM/ANM_rig_WALK_sg_v001/ANM_rig_WALK_sg_v001.mng"/>

    </pubgroup>
</publish>

我尝试了.firstChild.childNodes[],它将输出的内容打印为我的 xml 文件。这是我试图解析的 xml 文件列表,其中的格式大致相同。

我正在尝试这样做是 pythonic 方式

【问题讨论】:

标签: python xml-parsing


【解决方案1】:

您可以使用ElementTree API 轻松修改您的xml 文件

from xml.etree.ElementTree import parse
doc = parse('data.xml')
root = doc.getroot()
for t in root.iterfind('pubgroup/member'):
    t.attrib['objlocation'] = "spam"

doc.write('output.xml', xml_declaration=True)

iterfind 方法返回一个generator 函数而不是list,如果您的xml 文件非常大,这将非常方便

输出

<?xml version='1.0' encoding='us-ascii'?>
<publish show="STATE">

    <pubgroup location="/user_data/STATE/ITEM/character/ANM/ANM_rig_WALK_sg_v001/ANM_rig_WALK_sg_v001.xml" objtype="ELE">

        <member objidx="15283942" objlabel="anm" objlocation="spam" />

        <member objidx="15283952" objlabel="fbx" objlocation="spam" />

        <member objidx="15283962" objlabel="mov" objlocation="spam" />

        <member objidx="15283972" objlabel="libraryinfo" objlocation="spam" />

    <member objidx="15283982" objlabel="thumbnail" objlocation="spam" />

</pubgroup>

这里spamobjlocation 新值。

【讨论】:

  • 只是一个问题,如果我想添加/删除/编辑一行的内容,是否有可能?例如。 &lt;member objidx="15283942" objlabel="anm" objlocation="spam" /&gt;?
  • @dissidia 您可以插入/删除或编辑您想要的任何标签。您可能需要阅读文档以获取更多信息docs.python.org/3/library/xml.etree.elementtree.html#tutorial
【解决方案2】:

我能建议的最短代码:

from xml.etree.ElementTree import ElementTree
tree = ElementTree()
root = tree.parse('test.txt') # root represents <publish> tag

for member in root.findall('pubgroup/member'):
    print member.attrib['objlocation']

输出:

/user_data/STATE/ITEM/character/ANM/ANM_rig_WALK_sg_v001/ANM_rig_WALK_sg_v001.anm
/user_data/STATE/ITEM/character/ANM/ANM_rig_WALK_sg_v001/ANM_rig_WALK_sg_v001_M_WALK_None.fbx
/user_data/STATE/ITEM/character/ANM/ANM_rig_WALK_sg_v001/ANM_rig_WALK_sg_v001.mov
/user_data/STATE/ITEM/character/ANM/ANM_rig_WALK_sg_v001/ANM_rig_WALK_sg_v001.json
/user_data/STATE/ITEM/character/ANM/ANM_rig_WALK_sg_v001/ANM_rig_WALK_sg_v001.mng

进行更改:

for member in root.findall('pubgroup/member'):
    member.attrib['objlocation'] = 'changed'
tree.write('output.txt')

【讨论】:

  • 您好,很抱歉回复晚了。想知道是否可以只编辑objlabel="libraryinfo"objlocation,而其余部分保持原样?
猜你喜欢
  • 1970-01-01
  • 2015-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多