如何使用 lxml 更改 XML 文件中的 element.text

How to change an element.text in XML file using lxml

这里是一个 xml 文件的例子:这里 houseNum 不是连续的。

<?xml version="1.0" encoding="utf-8"?>
<ArrayOfHouse>
<XmlForm>
<houseNum>0</houseNum>
 <plan1> 
  <coord>
    <X> 1.2  </X>
    <Y> 2.1  </Y>
    <Z> 3.0  </Z>
  </coord>
  <color> 
    <R> 255 </R>
    <G> 0   </G>
    <B> 0   </B>
  </color>
 </plan1>
 <plan2>
  <coord>  
    <X> 21.2  </X>
    <Y> 22.1  </Y>
    <Z> 31.0  </Z>
  </coord>
  <color> 
    <R> 255 </R>
    <G> 0   </G>
    <B> 0   </B>
</color>
 </plan2> 
</XmlForm>

<XmlForm>
<houseNum>3</houseNum>
 <plan1> 
  <coord>
    <X> 1.2  </X>
    <Y> 2.1  </Y>
    <Z> 3.0  </Z>
  </coord>
  <color> 
    <R> 255 </R>
    <G> 0   </G>
    <B> 0   </B>
  </color>
 </plan1>
 <plan2>
  <coord>  
    <X> 21.2  </X>
    <Y> 22.1  </Y>
    <Z> 31.0  </Z>
  </coord>
  <color> 
    <R> 255 </R>
    <G> 0   </G>
    <B> 0   </B>
</color>
 </plan2> 
</XmlForm>

<XmlForm>
<houseNum>5</houseNum>
 <plan1> 
  <coord>
    <X> 11.2  </X>
    <Y> 12.1  </Y>
    <Z> 13.0  </Z>
  </coord>
  <color> 
    <R> 255 </R>
    <G> 255   </G>
    <B> 0   </B>
  </color>
 </plan1>
 <plan2>
  <coord>  
    <X> 211.2  </X>
    <Y> 212.1  </Y>
    <Z> 311.0  </Z>
  </coord>
  <color> 
    <R> 255 </R>
    <G> 0   </G>
    <B> 255   </B>
</color>
 </plan2> 
</XmlForm>
</ArrayOfHouse>

我想将 .text 修改为 0,1,3 而不是 0, 3,5.Here 是我使用 lxml 的脚本,它会生成错误的结果。

def Rename_Elem_In_Xml_File(xml_file, index_start, index_end):
    # Parse from the xml string file
    tree = etree.parse(xml_file)
    #Rename the elements
    root = tree.getroot()
    elementlist = [e for e in root.iter('houseNum')]
    for index_element in range(1, len(elementlist)):
        try:
           if(index_element>index_start):
                elementlist[index_element].text=index_element
                print(elementlist[index_element].text)
        except:
            print(' except  ')
            print(elementlist[index_element].text)
    file = etree.tostring(root).decode("utf-8")
    print(file)

我尝试遍历元素并更改文本。此脚本删除标签的文本和开头。

将 index_element 转换为字符串应该可以修复消失的 <houseNum> 标签。

elementlist[index_element].text=str(index_element)

...

>>> rename.Rename_Elem_In_Xml_File('houses.xml', 0, 10)
1
2
<ArrayOfHouse>
<XmlForm>
<houseNum>0</houseNum>
 <plan1>
  <coord>
    <X> 1.2  </X>
    <Y> 2.1  </Y>
    <Z> 3.0  </Z>
  </coord>
  <color>
    <R> 255 </R>
    <G> 0   </G>
    <B> 0   </B>
  </color>
 </plan1>
 <plan2>
  <coord>
    <X> 21.2  </X>
    <Y> 22.1  </Y>
    <Z> 31.0  </Z>
  </coord>
  <color>
    <R> 255 </R>
    <G> 0   </G>
    <B> 0   </B>
</color>
 </plan2>
</XmlForm>

<XmlForm>
<houseNum>1</houseNum>
 <plan1>
  <coord>
    <X> 1.2  </X>
    <Y> 2.1  </Y>
    <Z> 3.0  </Z>
  </coord>
  <color>
    <R> 255 </R>
    <G> 0   </G>
    <B> 0   </B>
  </color>
 </plan1>
 <plan2>
  <coord>
    <X> 21.2  </X>
    <Y> 22.1  </Y>
    <Z> 31.0  </Z>
  </coord>
  <color>
    <R> 255 </R>
    <G> 0   </G>
    <B> 0   </B>
</color>
 </plan2>
</XmlForm>

<XmlForm>
<houseNum>2</houseNum>
 <plan1>
  <coord>
    <X> 11.2  </X>
    <Y> 12.1  </Y>
    <Z> 13.0  </Z>
  </coord>
  <color>
    <R> 255 </R>
    <G> 255   </G>
    <B> 0   </B>
  </color>
 </plan1>
 <plan2>
  <coord>
    <X> 211.2  </X>
    <Y> 212.1  </Y>
    <Z> 311.0  </Z>
  </coord>
  <color>
    <R> 255 </R>
    <G> 0   </G>
    <B> 255   </B>
</color>
 </plan2>
</XmlForm>
</ArrayOfHouse>