我的问题并不是真正的问题,因为该程序现在的工作方式,但我正在寻找一种方法来提高它的可维护性,因为系统增长速度非常快。
本质上,我有一个函数(让我们称之为' )来处理XML(以python dict的形式)它负责从这个XML中获取特定的元素数组(让我们称之为' obj' )。问题是我们处理来自不同来源的大量XML,因此,每个XML都有自己的结构, obj 元素位于不同的位置。
代码目前采用以下结构:
function a(self, code, ...):
xml_doc = ... # this is a dict from a xml document that can have one of many different structures
obj = None # Array of objects that I want to get from the XML. It might be processed later but is eventually returned.
#Because the XML can have different structures, the object I want to get can be placed in different (well-known) places depending on the code value.
if code is 'a':
obj = xml_doc["key1"]["key2"]
elif code is 'b':
obj = xml_doc["key3"]
...
# code that processes the obj object
...
elif code is 'b':
obj = xml_doc["key4"]["key5"]["key6"]
... # elif for different codes goes indefinitely
return obj
正如您所看到的(或不是 - 但相信我),向此函数添加新条目并将代码添加到必须处理的案例中并不是非常友好。所以我一直在寻找一种方法来使用字典将代码映射到正确的XML结构。以下示例的方向:
...
xml_doc = ...
# That would be extremely neat.
code_to_pattern = {
'a': xml_doc["key1"]["key2"],
'b': xml_doc["key3"],
'c': xml_doc["key4"]["key5"]["key6"],
...
}
obj = code_to_pattern[code]
obj = self.process_xml(code, obj) # It will process the array if it has to in another function.
return obj
...
但是,上述代码由于显而易见的原因而无法正常工作。 code_to_pattern 字典的每个条目都试图访问可能不存在的 xml_doc 中的元素,然后引发异常。我想把条目添加为字符串,然后使用 exec()函数,所以python只在合适的时刻解释字符串,但是我没有找到exec函数和我我相信有人可以提出更好的主意。
XML的条件处理部分很容易做到,但是我不能以更好的方式思考一个简单的方法来向系统添加新条目。
如果有人可以帮我提出一些想法,我会非常高兴。
EDIT1:谢谢你的回复,伙计们。你们俩(@jarondl和@holdenweb)给了我可行的工作思路。对于正确的答案,即使我要通过xPath解决它,我也会选择那个要求我改变格式的方法。