Python:如何编辑XML文件的元素?

前端之家收集整理的这篇文章主要介绍了Python:如何编辑XML文件的元素? 前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我有一个XML文件,该文件包含许多命名元素,每个元素下面都有几个节点:

  1. <name search = "select ARG: write">
  2. <version id = "1.0.0">
  3. <value>myVal</value>
  4. <method>myMethod</method>
  5. </version>
  6. </name>
  7. <name search = "select ARG: bla">
  8. <version id = "2.0.0">
  9. <value>myVal</value>
  10. <method>myMethod</method>
  11. </version>
  12. </name>

我想搜索这个XML文件,并且如果该名称搜索值以select ARG开头(在我的示例中,第一个值是select ARG:write),我想创建这个新的命名元素,但是这次是选择ARG的值:应选择写ARG:写.这是我尝试过的:

  1. from xml.dom import minidom
  2. xamlfile = r'C:\file.xml'
  3. newxamlfile = r'C:\new.xml'
  4. dom = minidom.parse(xamlfile)
  5. # Fetch the desired elements in the tree.
  6. res = dom.getElementsByTagName('name')
  7. # Loop through all.
  8. for element in res:
  9. search_name_value = element.getAttribute('search')
  10. # Filter for the attribute and value.
  11. if search_name_value.startswith('select ARG:'):
  12. # In case of match,replace.
  13. element.setAttribute('search_name',search_name_value.replace('select ARG:','selected ARG:'))
  14. # Store the file.
  15. with open(newxamlfile,'w') as f:
  16. f.write(dom.toxml())

在这里,我替换了所需的字符串,而不添加新的字符串,而是编辑所需的元素,而不是创建新的元素并将其添加文件中.

有什么建议怎么做?

更新

这是我之前的文件

  1. <project version="4">
  2. <name search="select ARG: write">
  3. <version id="1.0.0">
  4. <value>myVal</value>
  5. <method>myMethod</method>
  6. </version>
  7. </name>
  8. <name search="select ARG: bla">
  9. <version id="2.0.0">
  10. <value>myVal</value>
  11. <method>myMethod</method>
  12. </version>
  13. </name>
  14. </project>

这就是我想要我的文件的方式:

  1. <project version="4">
  2. <name search="select ARG: write">
  3. <version id="1.0.0">
  4. <value>myVal</value>
  5. <method>myMethod</method>
  6. </version>
  7. </name>
  8. <name search="selected ARG: write">
  9. <version id="1.0.0">
  10. <value>myVal</value>
  11. <method>myMethod</method>
  12. </version>
  13. </name>
  14. <name search="select ARG: bla">
  15. <version id="2.0.0">
  16. <value>myVal</value>
  17. <method>myMethod</method>
  18. </version>
  19. </name>
  20. <name search="selected ARG: bla">
  21. <version id="2.0.0">
  22. <value>myVal</value>
  23. <method>myMethod</method>
  24. </version>
  25. </name>
  26. </project>

编辑

根据@DirtyBit的建议:

  1. xmldoc = minidom.parse(xamlfile)
  2. tags = xmldoc.getElementsByTagName("name")
  3. for item in tags:
  4. str = item.attributes["search"].value
  5. if 'select ARG' in str:
  6. item.attributes["search"].value = item.attributes["search"].value.replace('select ARG','selected ARG')
  7. with open(xamlfile,"a+") as f:
  8. xmldoc.writexml(f)

这工作正常,但我有2个问题:

>如您所见,我添加了if语句,因为我想复制并仅在选择ARG的值中创建新节点(并将其替换为所选的ARG),而不复制没有达到此条件的其他节点.
>在新XML文件的中间,我有这行:

< / element><?xml version =“ 1.0”?>< element>

最佳答案
下面的代码克隆所需的元素,并将其附加到文档末尾.

55394530.xml是一个文件,其中包含从示例XML中获取的数据

  1. import xml.etree.ElementTree as ET
  2. import copy
  3. from xml.dom import minidom
  4. tree = ET.parse('55394530.xml')
  5. names_to_duplicate = [e for e in tree.findall('.//name') if e.attrib.get('search').startswith('select ARG:')]
  6. for name in names_to_duplicate:
  7. clone = copy.deepcopy(name)
  8. clone.attrib['search'] = clone.attrib['search'].replace('select','selected')
  9. tree.getroot().append(clone)
  10. xmlstr = minidom.parseString(ET.tostring(tree.getroot())).toprettyxml()
  11. with open('out.xml','w') as out:
  12. out.write(xmlstr)

输出

  1. <element>
  2. <name search="select ARG: 123">
  3. <version id="1.1.1">
  4. <value>bla</value>
  5. <method>blabla</method>
  6. </version>
  7. </name>
  8. <name search="select ARG: 456">
  9. <version id="1.1.1">
  10. <value>bla</value>
  11. <method>blabla</method>
  12. </version>
  13. <version id="1.1.1">
  14. <value>bla</value>
  15. <method>blabla</method>
  16. </version>
  17. <version id="1.1.1">
  18. <value>bla</value>
  19. <method>blabla</method>
  20. </version>
  21. </name>
  22. <name search="text ARG: 789">
  23. <version id="1.1.1">
  24. <value>bla</value>
  25. <method>blabla</method>
  26. </version>
  27. </name>
  28. <name search="foo ARG: 444">
  29. <version id="1.1.1">
  30. <value>bla</value>
  31. <method>blabla</method>
  32. </version>
  33. </name>
  34. <name search="test ARG: Cancel">
  35. <version id="1.1.1">
  36. <value>bla</value>
  37. <method>blabla</method>
  38. </version>
  39. </name>
  40. <name search="selected ARG: 123">
  41. <version id="1.1.1">
  42. <value>bla</value>
  43. <method>blabla</method>
  44. </version>
  45. </name>
  46. <name search="selected ARG: 456">
  47. <version id="1.1.1">
  48. <value>bla</value>
  49. <method>blabla</method>
  50. </version>
  51. <version id="1.1.1">
  52. <value>bla</value>
  53. <method>blabla</method>
  54. </version>
  55. <version id="1.1.1">
  56. <value>bla</value>
  57. <method>blabla</method>
  58. </version>
  59. </name>
  60. </element>

猜你在找的Python相关文章