Определите поврежденные XML-файлы внутри заархивированного архива.Python

Программы на Python
Ответить
Гость
 Определите поврежденные XML-файлы внутри заархивированного архива.

Сообщение Гость »

Я пытаюсь прочитать большое количество заархивированных файлов (.zip или .docx) в цикле, каждый из которых снова содержит большое количество встроенных файлов XML (.xml). Однако некоторые из встроенных файлов XML повреждены или повреждены. Я могу создать синтаксический анализатор, который игнорирует ошибки и загружает содержимое XML. Однако я хочу знать, какой XML-файл поврежден и какой конкретный элемент внутри него сломан/неисправен. Я попробовал приведенный ниже код:

Код: Выделить всё

import re
import os
import zipfile
from lxml import etree

for file in os.listdir(filepath):
if file.endswith('.zip') or file.endswith('.docx'):
ext = os.path.splitext(file)[1]
newfile = f"{os.path.splitext(os.path.basename(file))[0]}_new{ext}"

zippedin = zipfile.ZipFile(os.path.join(filepath, file), 'r')
recovering_parser = etree.XMLParser(recover=True)
matched_items = []

for item in zippedin.infolist():
xmltree = etree.fromstring(zippedin.read(item.filename), parser=recovering_parser)

for node in xmltree.iter(tag=etree.Element):
if re.search('XXXXXXX', str(node)) or re.search('YYYYYYYY', str(node.attrib)):
matched_items.append(item)

with zipfile.ZipFile(os.path.join(filepath, newfile), 'w') as zippedout:
for element in matched_items:
zippedout.writestr(element, zippedin.read(element.filename))
zippedin.close()
Этот фрагмент кода прекрасно работает и обходит поврежденные XML-файлы внутри заархивированных архивов. Однако мне нужно определить, какие файлы вышли из строя, а также отдельные компоненты. Если я удалю часть Recovery_parser, я получу сообщения об ошибках следующего вида:

Код: Выделить всё

lxml.etree.XMLSyntaxError: xmlns: 'ABCDEFGHXXXX' is not a valid URI, line 5, column 45
Не показывает, какой XML поврежден. Может ли кто-нибудь помочь мне идентифицировать поврежденные XML-файлы и правильный способ обработки исключений, а также очистки/извлечения ошибок/извлечения имени неисправного компонента.

Подробнее здесь: https://stackoverflow.com/questions/793 ... ed-archive
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»