Добавить теги с атрибутами в XML с помощью minidom - PullRequest
0 голосов
/ 03 января 2019

Я анализирую 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)
...