使用minidom将带有属性的标记附加到XML

2024-05-15 06:24:55 发布

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

我正在使用minidom解析xml。我想要实现的是找到所有具有特定属性的标记,然后在其下面附加一个具有不同属性值的新标记。例如

假设标签是:

<PROPVAL ISFORMULA="N" LOCALIZABLE="false" NAME="EntDataRegion" VALUE="XYZ"/>

我找到了所有具有属性值NAME = "EntReg"的标记。现在我想在它下面附加一个标签。你知道吗

<PROPVAL ISFORMULA="N" LOCALIZABLE="false" NAME="EntRoutingDataSelected" VALUE="yes"/>

标记名和值将是静态的,即我希望在PROPVAL属性NAME具有值EntDataRegion的地方附加相同的标记。你知道吗

到目前为止,我已经写了这篇文章并找到了所有PROPVAL标记:

xmldoc = minidom.parse('test.xml')
prop_val = xmldoc.getElementsByTagName('PROPVAL')
for i in prop_val:
    if i.attributes['NAME'].value == 'PB:EntDataRegion':
        print(i.attributes['VALUE'].value)

编辑

XML结构如下:

<?xml version="1.0" encoding="UTF-8"?>
<MOD version="3">
<CLASS>
<CLASS COMMENT="" DEFAULTPRIORITY="50">
<PROPVAL ISFORMULA="N" LOCALIZABLE="false" NAME="EntDataRegion" VALUE="XYZ"/>
<RULE LOCALIZABLE="false"/>
<ITEM>
<PROPVAL ISFORMULA="N" LOCALIZABLE="false" NAME="HIDE" VALUE="XYZ"/>
</ITEM>
</CLASS>
<CLASS COMMENT="" DEFAULTPRIORITY="50">
<PROPVAL ISFORMULA="N" LOCALIZABLE="false" NAME="EntDataRegion" VALUE="XYZ"/>
<RULE LOCALIZABLE="false"/>
<ITEM>
<PROPVAL ISFORMULA="N" LOCALIZABLE="false" NAME="HIDE" VALUE="XYZ"/>
</ITEM>
</CLASS>
</CLASS> 
<CLASS>
<ITEM>
<PROPVAL ISFORMULA="N" LOCALIZABLE="false" NAME="EntDataRegion" VALUE="XYZ"/>
<PROPVAL ISFORMULA="N" LOCALIZABLE="false" NAME="EntRoutingDataSelected" VALUE="yes"/>
</ITEM>
</CLASS>
</MOD>

xml有两个标记CLASS<ITEM>。class标记可以将item标记作为子标记。但在将item作为子标记之前,它总是有一堆<PROPVAL>标记。你知道吗

我们的想法是插入

<PROPVAL ISFORMULA="N" LOCALIZABLE="false" NAME="EntRoutingDataSelected" VALUE="yes"/>

之前

<PROPVAL ISFORMULA="N" LOCALIZABLE="false" NAME="EntDataRegion" VALUE="XYZ"/>

问题是我能插入上面的标签。具有item标记的class标记也具有此属性。而我只希望ITEM标记具有这个属性,如果它们具有<PROPVAL NAME="EntDataRegion">

这就是我尝试过的:

from xml.dom import minidom
xmldoc = minidom.parse('test.xml')
prop_val = xmldoc.getElementsByTagName('PROPVAL')
class_xml = xmldoc.getElementsByTagName('CLASS')
item_xml = xmldoc.getElementsByTagName('ITEM')
newScript = xmldoc.createElement("PROPVAL")
newScript.setAttribute("ISFORMULA"  , "N")
newScript.setAttribute("LOCALIZABLE", "false")
newScript.setAttribute("NAME", "EntRoutingDataSelected")
newScript.setAttribute("VALUE", "yes")
print(newScript.toxml())

for i in range(len(class_xml)):
   item = class_xml[i]
   item_chidren = item.childNodes
   item.insertBefore(newScript, item_chidren[4])


with open('newtest.xml', 'w') as f:
    xmldoc.writexml(f)

Tags: name标记falsevaluexmlitemclassxyz

热门问题