Моя задача состоит в том, чтобы сделать незначительные рефакторинга некоторых элементов XML дерева в Python 3, а именно заменить следующую структуру:Условное удаление элемента из XML-дерева документа
<span class="nobr">
<a href="http://www.google.com/">
http://www.google.com/
<sup>
<img align="absmiddle" alt="" border="0" class="rendericon" height="7" src="http://jira.atlassian.com/icon.gif" width="7"/>
</sup>
</a>
</span>
С:
<span class="nobr">
<a href="http://www.google.com/">
http://www.google.com/
</a>
</span>
Т.е. - удалить элемент sup, если целая структура точно соответствует той, которая приведена в первом примере. Мне нужно сохранить XML-документ во время процесса, поэтому соответствие регулярных выражений не представляется возможным.
У меня уже есть код, который работает для моих целей:
doc = self.__refactor_links(doc)
...
def __refactor_links(self, node):
"""Recursively seeks for links to refactor them"""
for span in node.childNodes:
replace = False
if isinstance(span, xml.dom.minidom.Element):
if span.tagName == "span" and span.getAttribute("class") == "nobr":
if span.childNodes.length == 1:
a = span.childNodes.item(0)
if isinstance(a, xml.dom.minidom.Element):
if a.tagName == "a" and a.getAttribute("href"):
if a.childNodes.length == 2:
aurl = a.childNodes.item(0)
if isinstance(aurl, xml.dom.minidom.Text):
sup = a.childNodes.item(1)
if isinstance(sup, xml.dom.minidom.Element):
if sup.tagName == "sup":
if sup.childNodes.length == 1:
img = sup.childNodes.item(0)
if isinstance(img, xml.dom.minidom.Element):
if img.tagName == "img" and img.getAttribute("class") == "rendericon":
replace = True
else:
self.__refactor_links(span)
if replace:
a.removeChild(sup)
return node
Это один не проходит через все теги рекурсивно - если он соответствует что-то похожее на структуру она стремится - даже если это не удается, он не продолжает искать структуру внутри этих элементов, но в моем случае я не должен это делать (хотя это было бы неплохо иметь, но стоимость добавления кучи else: self .__ refactor_links (tag) kill это в моих глазах).
Если какое-либо условие не выполняется, удаление не должно происходить. Есть ли более чистый способ определить множество условий, избегая огромного набора «ifs»? Для сохранения условий может использоваться некоторая структура пользовательских данных, например. ('sup', ('img', (...))), но я не знаю, как его обрабатывать. Если у вас есть какие-либо предложения или примеры в python - пожалуйста, помогите.
Спасибо.
Ouch. 'import this':' ... Flat лучше вложенного. ... ' –