Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用python数据帧更新和添加XML文件中的属性_Python_Xml_Pandas_Elementtree_Xml.etree - Fatal编程技术网

如何使用python数据帧更新和添加XML文件中的属性

如何使用python数据帧更新和添加XML文件中的属性,python,xml,pandas,elementtree,xml.etree,Python,Xml,Pandas,Elementtree,Xml.etree,我是XML新手,有没有有效的方法使用熊猫数据框匹配文本并更新XML文件 这是我的大XML文件的一小部分,它仍然遵循适当的格式 XML文件(input.XML): #文件继续。。。。 数据帧(用作输入): 我想匹配name列中的元素,如果匹配,则使用列的其余部分创建新属性,如下所示。例如,如果来自df['name']的元素(M_20_K40745170)存在/匹配,则在输出文件中分别使用以下行更新相应的节点 <per fre="Volum_5mb" value=&qu

我是XML新手,有没有有效的方法使用熊猫数据框匹配文本并更新XML文件

这是我的大XML文件的一小部分,它仍然遵循适当的格式

XML文件(input.XML):


#文件继续。。。。
数据帧(用作输入):

我想匹配
name
列中的元素,如果匹配,则使用列的其余部分创建新属性,如下所示。例如,如果来自
df['name']
的元素(
M_20_K40745170
)存在/匹配,则在输出文件中分别使用以下行更新相应的节点

<per fre="Volum_5mb" value="89.00"/>
<per fre="Volum_40mb" value="44.00"/>
<per fre="Volum_70mb" value="77.00"/>
我对Python XML编码还不熟悉。我不知道如何使用熊猫数据帧在XML文件中添加新属性。 请帮忙。
感谢和问候。

您可以学习
xml
xpath
,因为主要问题与
pandas
无关,而是
xml

您可以使用更复杂的
xpath
查找名为
M_20_K40745170
的节点和子节点
mwam
,您必须在其中搜索
pre
并更新它(甚至添加新的
pre

您可以为此使用
df.iterrows()

for index, row in df.iterrows():
    node = root.find('./design/sec[@name="{}"]//mwan'.format(row['name']))
for fre in ['Volum_5mb', 'Volum_40mb', 'Volum_70mb']:

    item = node.find('./per[@fre="{}"]'.format(fre))
    #print(fre, item)

    if not item:
        item = ET.SubElement(node, 'per')
        item.set('fre', fre)

    item.set('value', str(row[fre]))
稍后,您可以使用
“volume\u 5mb”

并创建新的和/或更新值

if not item:  # if item is None:
    item = ET.SubElement(node, 'per')
    item.set('fre', "Volum_5mb")

item.set('value', str(row['Volum_5mb']))
您可以使用list
['volumu\u 5mb'、'volumu\u 40mb'、'volumu\u 70mb']
进行此操作

for index, row in df.iterrows():
    node = root.find('./design/sec[@name="{}"]//mwan'.format(row['name']))
for fre in ['Volum_5mb', 'Volum_40mb', 'Volum_70mb']:

    item = node.find('./per[@fre="{}"]'.format(fre))
    #print(fre, item)

    if not item:
        item = ET.SubElement(node, 'per')
        item.set('fre', fre)

    item.set('value', str(row[fre]))

代码中直接包含示例数据的最小工作代码,但您应该从文件中读取它们

text = '''                name       Volum_5mb      Volum_40mb     Volum_70mb
1     M_20_K40745170         89.00           44.00         77.00
2     M_20_K40745171         77.00           65.00         94.00'''

xml = '''<?xml version="1.0" encoding="UTF-8"?>
<brand by="hhdhdh" date="2014/01/01" name="OOP-112200" Insti="TGA">
   <design name="OOP-112200" own="TGA" descri="" sound_db="JJKO">
      <sec name="abcd" sound_freq="abcd" c_ty="pv">
         <feature number="48">
            <tfgt v="0.1466469683747654" y="0.0" units="sec" />
         </feature>
         <mwan sound_freq="abcd" first_name="g7tty" description="xyz" />
      </sec>
      <sec name="M_20_K40745170" sound_freq="mhr17:7907527-7907589" tension="SGCGSCGSCGSCGSC" s_c="0">
         <feature number="5748">
            <tfgt v="0.1466469683747654" y="0.0" units="sec" />
         </feature>
         <mwan sound_freq="mhr17:7907527-7907589" first_name="g7tty" description="xyz">
         </mwan>
      </sec>
      <sec name="M_20_K40745171" sound_freq="mhr17:7907528-7907599" tension="SGCGSCGSCGSHHGSC" s_c="0">
         <feature number="5748">
            <tfgt v="0.1466469683747654" y="0.0" units="sec" />
         </feature>
         <mwan sound_freq="mhr17:7907527-7907589" first_name="gtftty" description="xyz">
            <xyz abc="trt" id="abc" />
            <per fre="acc" value="abc" />
            <per fre="xyz" value="abc" />
            <per fre="yy" value="abc" />
         </mwan>
      </sec>
   </design>
</brand>'''

import pandas as pd
import io
import xml.etree.ElementTree as ET

#df = pd.read_csv('input.csv')
df = pd.read_csv(io.StringIO(text), sep='\s+')
#print(df)

#tree = ET.('input.xml')
#root = tree.getroot()
root = ET.fromstring(xml)
tree = ET.ElementTree(root)

for index, row in df.iterrows():
    node = root.find('./design/sec[@name="{}"]//mwan'.format(row['name']))
    
    for fre in ['Volum_5mb', 'Volum_40mb', 'Volum_70mb']:

        item = node.find('./per[@fre="{}"]'.format(fre))
        #print('item:', fre, '=', item)

        if not item:
            #print('new', item, fre)
            item = ET.SubElement(node, 'per')
            #item.tail = '\n         '  # to pretty print
            item.set('fre', fre)

        item.set('value', str(row[fre]))

    #print(ET.tostring(node).decode())
    
#---
    
print( ET.tostring(root) )
#tree.write('output.xml')
text=''名称卷大小为5mb卷大小为40mb卷大小为70mb
1米20米K40745170 89.00 44.00 77.00
2米20米K40745171 77.00 65.00 94.00英寸
xml=“”
'''
作为pd进口熊猫
输入io
将xml.etree.ElementTree作为ET导入
#df=pd.read\u csv('input.csv')
df=pd.read_csv(io.StringIO(文本),sep='\s+'))
#打印(df)
#tree=ET.('input.xml')
#root=tree.getroot()
root=ET.fromstring(xml)
tree=ET.ElementTree(根)
对于索引,df.iterrows()中的行:
node=root.find('./design/sec[@name=“{}”]//mwan.format(行['name']))
对于[‘容量5mb’、‘容量40mb’、‘容量70mb’]中的fre:
item=node.find('./每[@fre=“{}”]'.格式(fre))
#打印('item:',fre',=',item)
如果不是项目:
#打印('新',项目,频率)
item=ET.SubElement(节点“per”)
#item.tail='\n'#要打印
项目集('fre',fre)
item.set('value',str(行[fre]))
#打印(ET.tostring(node.decode())
#---
打印(ET.tostring(根))
#write('output.xml')


Doc:

首先学习如何使用
xlm.etree
以及如何使用,因为您的主要问题与
pandas
没有直接关系。那么
node.set(“value”,“89.00”)
您可以先找到所有节点,然后将它们与
df
一起使用-这样您只需搜索每个节点一次。在当前代码中,您可以多次搜索同一个节点。顺便说一句:
node=tree.findall('./design/sec[@name=“M\u 20\u K40745170”]”)
,以后您可以执行
node.find('./per[@fre=“volume\u 5mb”]\)
谢谢您的建议!您正在添加和
pre
作为新属性,而不是
per
,因为您正在使用
pre和“volumu_5mb”
搜索/检查,无论如何,您将得到
顺便说一句,谢谢您的解释
for fre in ['Volum_5mb', 'Volum_40mb', 'Volum_70mb']:

    item = node.find('./per[@fre="{}"]'.format(fre))
    #print(fre, item)

    if not item:
        item = ET.SubElement(node, 'per')
        item.set('fre', fre)

    item.set('value', str(row[fre]))
text = '''                name       Volum_5mb      Volum_40mb     Volum_70mb
1     M_20_K40745170         89.00           44.00         77.00
2     M_20_K40745171         77.00           65.00         94.00'''

xml = '''<?xml version="1.0" encoding="UTF-8"?>
<brand by="hhdhdh" date="2014/01/01" name="OOP-112200" Insti="TGA">
   <design name="OOP-112200" own="TGA" descri="" sound_db="JJKO">
      <sec name="abcd" sound_freq="abcd" c_ty="pv">
         <feature number="48">
            <tfgt v="0.1466469683747654" y="0.0" units="sec" />
         </feature>
         <mwan sound_freq="abcd" first_name="g7tty" description="xyz" />
      </sec>
      <sec name="M_20_K40745170" sound_freq="mhr17:7907527-7907589" tension="SGCGSCGSCGSCGSC" s_c="0">
         <feature number="5748">
            <tfgt v="0.1466469683747654" y="0.0" units="sec" />
         </feature>
         <mwan sound_freq="mhr17:7907527-7907589" first_name="g7tty" description="xyz">
         </mwan>
      </sec>
      <sec name="M_20_K40745171" sound_freq="mhr17:7907528-7907599" tension="SGCGSCGSCGSHHGSC" s_c="0">
         <feature number="5748">
            <tfgt v="0.1466469683747654" y="0.0" units="sec" />
         </feature>
         <mwan sound_freq="mhr17:7907527-7907589" first_name="gtftty" description="xyz">
            <xyz abc="trt" id="abc" />
            <per fre="acc" value="abc" />
            <per fre="xyz" value="abc" />
            <per fre="yy" value="abc" />
         </mwan>
      </sec>
   </design>
</brand>'''

import pandas as pd
import io
import xml.etree.ElementTree as ET

#df = pd.read_csv('input.csv')
df = pd.read_csv(io.StringIO(text), sep='\s+')
#print(df)

#tree = ET.('input.xml')
#root = tree.getroot()
root = ET.fromstring(xml)
tree = ET.ElementTree(root)

for index, row in df.iterrows():
    node = root.find('./design/sec[@name="{}"]//mwan'.format(row['name']))
    
    for fre in ['Volum_5mb', 'Volum_40mb', 'Volum_70mb']:

        item = node.find('./per[@fre="{}"]'.format(fre))
        #print('item:', fre, '=', item)

        if not item:
            #print('new', item, fre)
            item = ET.SubElement(node, 'per')
            #item.tail = '\n         '  # to pretty print
            item.set('fre', fre)

        item.set('value', str(row[fre]))

    #print(ET.tostring(node).decode())
    
#---
    
print( ET.tostring(root) )
#tree.write('output.xml')