Python使用ElementTree将新项插入XML子元素的更简单方法

Python使用ElementTree将新项插入XML子元素的更简单方法,python,xml-parsing,elementtree,Python,Xml Parsing,Elementtree,我正在编辑一个配置文件,希望在结构中添加新的子元素。我遇到的问题是,在配置文件中,子元素具有相同的名称,并且我没有找到一种方法来使用.find命令查找插入位置的索引。配置文件的示例如下: <?xml version="1.0" encoding="utf-8"?> <ConfigurationFile> <Configuration ItemName="Parent1"> <Category ItemName="Parent2">

我正在编辑一个配置文件,希望在结构中添加新的子元素。我遇到的问题是,在配置文件中,子元素具有相同的名称,并且我没有找到一种方法来使用.find命令查找插入位置的索引。配置文件的示例如下:

<?xml version="1.0" encoding="utf-8"?>

<ConfigurationFile>
  <Configuration ItemName="Parent1">
    <Category ItemName="Parent2">
      <Category ItemName="Parent3">
        <Category ItemName="ChildLevelToAdd">
          <Option ItemName="x" ValueType="6">5</Option>
          <Option ItemName="z" ValueType="6">0</Option>
          <Category ItemName="ChildCategory">
            <Option ItemName="a" ValueType="1"></Option>
            <Option ItemName="b" ValueType="2"></Option>
            <Option ItemName="c" ValueType="3">
            </Option>
            </Category>
        </Category>
      </Category>
</Category>
我发现插入新类别元素的最佳方法是使用:

root[0][0][0].insert(0,ET.Element("Category", ItemName = "NewChild"))
然后,当我想向新创建的类别添加选项时,我使用:

root[0][0][0][0].insert(0,ET.Element("NewOption", ItemName = "NewVal", ValueType ="NewType"))

这似乎是一种非常不整洁的方式。我想知道是否有更干净的方法来查找和指定新的子元素(类别)及其未来的子元素(选项)的插入点

//element\u name
的形式使用XPath表达式查找上下文节点中的任意元素(本例中为根元素)。例如,以下内容应返回
元素的第一个实例,位于
根目录中的任意位置:

root.find('.//Category') 
您还可以使用XPath通过元素的属性值来查找元素。例如,以下内容应返回
元素,其中
ItemName
属性值等于“Parent3”:

ElementTree支持其他一些XPath语法,如中所述


我还建议将新元素存储在一个变量中,以便以后可以向其中添加子元素,而无需再次查询XML:

c = ET.Element("Category", ItemName = "NewChild")
c.insert(0,ET.Element("NewOption", ItemName = "NewVal", ValueType ="NewType"))

p = root.find('.//Category[@ItemName="Parent3"]')
p.insert(0, c)

这项工作非常有效!
root.find('.//Category[@ItemName="Parent3"]')
c = ET.Element("Category", ItemName = "NewChild")
c.insert(0,ET.Element("NewOption", ItemName = "NewVal", ValueType ="NewType"))

p = root.find('.//Category[@ItemName="Parent3"]')
p.insert(0, c)