У меня есть несколько файлов XML, которые мне нужно проанализировать. Я написал некоторый код, который работает, но уродлив, и я хотел бы получить совет от людей, более опытных с XML, чем я.
Прежде всего, я мог бы использовать некоторые термины в неправильном контексте, потому что мой опыт работы с XML ограничен. Под элементом, если не указано иное, я имею в виду что-то вроде этого:
<root>
<element>
...
</element>
<element>
...
</element>
</root>
В любом случае, каждый файл состоит из нескольких элементов, с несколькими дочерними элементами (очевидно). Меня сбивает с толку то, что к соответствующим значениям нужно обращаться четырьмя различными способами;
1) Текст узла:
<tag>value</tag>
2) Атрибут:
<tag attribute="value"></tag>
3) Значение, скрытое внутри тега (в данном случае «true»):
<tag><boolean.true/></tag>
4) Значения внутри тегов с одинаковыми именами ("tagA"), но с тегами "grandparent" с разными именами ("tag1" и "tag2"), все в одном элементе. «tagA» мне не нужен, вместо этого я буду искать «tag1» и «tag2».
<element>
<tag1><tagA>value</tagA><tag1>
<tag2><tagA>value</tagA></tag2>
</element>
На данный момент у меня есть словарь с каждым файлом в качестве ключа. Значения являются словарями с ключами «атрибут», «текст узла», «тег» и «родительский элемент».
* * Пример тысяча двадцать-один: * * 1 022
{'file1.xml' : 'attributes' : {'Person': 'Id', 'Car' : 'Color'},
'node text': ['Name', 'Address'],
}
Где «Person» и «Car» являются тегами, а «Id» и «Color» являются именами атрибутов.
Это позволяет легко перебирать все элементы и проверять каждый тег, и, если в словаре есть совпадение (если elem.tag в dict ['file1.xml'] ['attribute']), извлечь значение .
Итак, как я уже сказал, код работает, но мне не нравится мое решение. Кроме того, не все элементы имеют все дочерние элементы (например, Person может не владеть автомобилем, тогда этот тег будет вообще отсутствовать), и мне нужно присвоить этим значениям значение «None». Прямо сейчас я получаю все теги, которые должны существовать для каждого элемента в каждом файле, превращаю их в набор, затем проверяю разницу между ними и набором тегов, из которых я фактически извлек значения для этого элемента. Опять же, код довольно уродливый.
Надеюсь, этот беспорядок имеет какой-то смысл.
редактирование:
Я использовал предложение Дж. Ф. Себастьяна о сохранении xpath для каждого значения в словаре с именем поля в качестве ключа и xpath в качестве значения.