Прежде всего, вам нужно определиться с тем, какой модуль вы собираетесь использовать. lxml
или xml
? Импортируйте только один из них. lxml
имеет больше возможностей, но это внешняя зависимость. xml
более простой, но встроенный. Оба модуля имеют много общего API, поэтому их легко спутать. Убедитесь, что вы просматриваете правильную документацию.
Для того, что вы хотите сделать, встроенный модуль достаточно хорош. Однако метод .xpath()
здесь не поддерживается, метод, который вы ищете здесь , называется .findall()
.
Тогда вам нужно помнить, что никогда не анализирует XML-файлы. открыв их как простые текстовые файлы , прочитав их в строку и проанализировав эту строку. Это не только расточительно, но и в корне неправильно. XML-парсеры имеют встроенное автоматическое обнаружение кодировки. Этот механизм гарантирует, что вам никогда не придется беспокоиться о кодировках файлов, но вы должны использовать его .
Это не только лучше, но и меньше кода для написания: используйте ET.parse()
ипередать имя файла.
import os
from xml.etree import ElementTree as ET
DIR = r'C:\Users\mypath'
for filename in os.listdir(DIR):
if not filename.lower().endswith(".xml"):
print("skipping for filename")
continue
fullname = os.path.join(DIR, filename)
tree = ET.parse(fullname)
for vector_file in tree.findall('.//vector_file'):
print(vector_file.text + '\n')
Если вы ожидаете только один элемент <vector_file>
на файл или если вам нужен только первый такой элемент, используйте .find()
вместо .findall()
:
vector_file = tree.find('.//vector_file')
if vector_file is None:
print('Nothing found')
else:
print(vector_file.text + '\n')