使用Python修改xml中的特定子元素

2024-04-26 03:21:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我开始玩弄Python,但在xml中遇到了麻烦

我试图编辑一个xml子元素,它可能是以一种不太传统的方式存储的,它有许多数字作为文本,更像是一个向量,所有子元素都命名为“double”,尽管它实际上是文本……然后我希望xml是

这是此类文件的一个示例

<simulation>
         <element1>'A'</element1>
         <element2>
              <subelement1>
                   <double>1</double>
                   <double>2</double>
                   <double>3</double>
                   <double>4</double>
                   <double>5</double>
              </subelement1>
              <subelement2>
                   <double>1</double>
                   <double>2</double>
                   <double>3</double>
                   <double>4</double>
                   <double>5</double>
              </subelement2>
         </element2>
</simulation>

我想做的是更改subelement1中的所有子节点值,例如:10、20、30、40、50,最后有类似的内容:

<simulation>
         <element1>'A'</element1>
         <element2>
              <subelement1>
                   <double>10</double>
                   <double>20</double>
                   <double>30</double>
                   <double>40</double>
                   <double>50</double>
              </subelement1>
              <subelement2>
                   <double>1</double>
                   <double>2</double>
                   <double>3</double>
                   <double>4</double>
                   <double>5</double>
              </subelement2>
         </element2>
</simulation>

可以通过以下方式访问我要更改的所有节点:

import xml.etree.ElementTree as ET

for elem in root:
    for subelem in elem.findall('.//element1/double'):
        print(subelem.attrib)
        print(subelem.text)

这显示了我想要更改的数字(见下文),但我无法找到一种方法将它们更改为我需要的数字

{} 1    {} 2    {} 3    {} 4    {} 5

如果我尝试将其用作向量或类似的东西:

for elem in root:
    for subelem in elem.findall('.//element1/double'):
        subelem.text = [10,20,30,40,50]
        print(subelem.text)

我最终没有替换,而是添加了信息,结果是:

{} 1 [10,20,30,40,50]
{} 2 [10,20,30,40,50]
{} 3 [10,20,30,40,50]
{} 4 [10,20,30,40,50]
{} 5 [10,20,30,40,50]

做这些改变的方法是什么?多谢各位


Tags: textin元素for数字xmlsimulationdouble
1条回答
网友
1楼 · 发布于 2024-04-26 03:21:56

对元素的text属性的赋值将替换该值,而不会追加。您的测试代码中一定有错误

您需要确保分配了一个字符串。ET将接受一个数字或一个列表,实际上是任何对象,但在稍后尝试序列化树时将崩溃。而且,在findall告诉它搜索整个子树之前,不需要枚举第一级元素

import xml.etree.ElementTree as ET

xmltext = """<simulation>
         <element1>'A'</element1>
         <element2>
              <subelement1>
                   <double>1</double>
                   <double>2</double>
                   <double>3</double>
                   <double>4</double>
                   <double>5</double>
              </subelement1>
              <subelement2>
                   <double>1</double>
                   <double>2</double>
                   <double>3</double>
                   <double>4</double>
                   <double>5</double>
              </subelement2>
         </element2>
</simulation>"""

root = ET.fromstring(xmltext)

# to apply a function to each text node
#for subelem in root.findall('.//subelement1/double'):
#    subelem.text = str(int(subelem.text) * 10)

# to replace a known number of text nodes
for subelem in root.findall('.//subelement1/[double]'):
    new_doubles = [10, 20, 30, 40 ,50]
    for elem, dbl in zip(subelem.findall('double'), new_doubles):
        elem.text = str(dbl)
    break

print(ET.tostring(root, encoding="utf-8").decode('utf-8'))

印刷品

<simulation>
         <element1>'A'</element1>
         <element2>
              <subelement1>
                   <double>10</double>
                   <double>20</double>
                   <double>30</double>
                   <double>40</double>
                   <double>50</double>
              </subelement1>
              <subelement2>
                   <double>1</double>
                   <double>2</double>
                   <double>3</double>
                   <double>4</double>
                   <double>5</double>
              </subelement2>
         </element2>
</simulation>

相关问题 更多 >