Я анализирую xml, используя minidom. Чего я хочу добиться, так это найти все теги с определенным атрибутом, а затем добавить новый тег с другим значением атрибута под ним. Например,
Допустим, тег:
<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>
. Тег класса может иметь тег элемента как дочерний тег. Но перед тем, как использовать элемент в качестве дочернего тега, у него всегда будет набор <PROPVAL>
тегов.
Идея состоит в том, чтобы вставить
<PROPVAL ISFORMULA="N" LOCALIZABLE="false" NAME="EntRoutingDataSelected" VALUE="yes"/>
до
<PROPVAL ISFORMULA="N" LOCALIZABLE="false" NAME="EntDataRegion" VALUE="XYZ"/>
Проблема в том, что я могу вставить вышеуказанный тег. Тот факт, что тег класса, который имеет тег элемента, также принимает это свойство. Принимая во внимание, что я хочу, чтобы теги 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)