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

时间:2017-10-25 03:19:15

标签: python xml lxml xml.etree

这是一个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。这是我使用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)

我尝试迭代元素并更改文本。该脚本删除文本和标记的开头。

1 个答案:

答案 0 :(得分:1)

将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>