105 lines
2.8 KiB
Python
105 lines
2.8 KiB
Python
import xml.etree.ElementTree as eT
|
|
|
|
|
|
class InfoPlistPatcher():
|
|
def __init__(self, infoPlistPath):
|
|
self.__infoPlistPath = infoPlistPath
|
|
|
|
def AddOrReplace(self, key_value_dict):
|
|
tree = eT.parse(self.__infoPlistPath)
|
|
plist_dict = tree.getroot().find('dict')
|
|
|
|
for keyName in key_value_dict:
|
|
value = key_value_dict[keyName]
|
|
if type(value) is str:
|
|
self.AppendOrReplaceValueByKey(keyName, value, plist_dict)
|
|
else:
|
|
self.AppendOrReplaceValuesByKey(keyName, value, plist_dict)
|
|
|
|
tree.write(self.__infoPlistPath, xml_declaration=True, encoding='UTF-8', method="xml")
|
|
|
|
def AppendOrReplaceValueByKey(self, key_name, value, dict_element):
|
|
key_index = self.FindIndexByKey(key_name, dict_element)
|
|
element_exists = key_index >= 0
|
|
|
|
if element_exists:
|
|
self.ReplaceValueByKeyIndex(key_index, value, dict_element)
|
|
else:
|
|
self.AppendKeyValue(key_name, value, dict_element)
|
|
|
|
def AppendOrReplaceValuesByKey(self, keyName, valuesArr, dictElement):
|
|
keyIndex = self.FindIndexByKey(keyName, dictElement)
|
|
elementExists = keyIndex >= 0
|
|
|
|
if elementExists:
|
|
self.ReplaceValuesByKeyIndex(keyIndex, valuesArr, dictElement)
|
|
else:
|
|
self.AppendValues(keyName, valuesArr, dictElement)
|
|
|
|
def FindIndexByKey(self, key_name, dict_element):
|
|
all_keys_elements = dict_element.findall('key')
|
|
|
|
is_exists = False
|
|
index = 0
|
|
|
|
for e in all_keys_elements:
|
|
if e.text == key_name:
|
|
is_exists = True
|
|
break
|
|
index += 1
|
|
|
|
element_index = index * 2
|
|
return element_index if is_exists else -1
|
|
|
|
def ReplaceValueByKeyIndex(self, key_element_index, value, dict_element):
|
|
value_index = key_element_index + 1
|
|
value_element = dict_element[value_index]
|
|
value_element.text = value
|
|
|
|
def ReplaceValuesByKeyIndex(self, keyIndex, valueArr, dict_element):
|
|
valuesIndex = keyIndex + 1
|
|
arrayElement = dict_element[valuesIndex]
|
|
|
|
children = arrayElement.findall('string')
|
|
arrayElement.remove(children)
|
|
|
|
self.fillArrayElementWithValues(arrayElement, valueArr)
|
|
|
|
def AppendKeyValue(self, keyName, value, dict_element):
|
|
key_element = self.createKeyElement(keyName)
|
|
value_element = self.createValueElement(value)
|
|
|
|
dict_element.append(key_element)
|
|
dict_element.append(value_element)
|
|
|
|
def AppendValues(self, keyName, valuesArr, parentElement):
|
|
keyElement = self.createKeyElement(keyName)
|
|
|
|
arrayElement = eT.Element('array')
|
|
self.fillArrayElementWithValues(arrayElement, valuesArr)
|
|
|
|
parentElement.append(keyElement)
|
|
parentElement.append(arrayElement)
|
|
|
|
def createKeyElement(self, keyName):
|
|
keyElement = eT.Element('key')
|
|
keyElement.text = keyName
|
|
|
|
return keyElement
|
|
|
|
def createValueElement(self, value):
|
|
valueElement = eT.Element('string')
|
|
valueElement.text = value
|
|
|
|
return valueElement
|
|
|
|
def fillArrayElementWithValues(self, arrayElement, values):
|
|
for value in values:
|
|
valueElement = self.createValueElement(value)
|
|
arrayElement.append(valueElement)
|
|
|
|
|
|
|
|
|
|
|