Python Minidom синтаксический анализ файловых объектов

Я написал код с использованием minidom, который берет скрипт xml, открывает его как файловый объект и затем анализирует этот файловый объект. Мало того, я хочу, чтобы скрипт открывал несколько файлов, содержащихся в папке, и анализировал каждый из них по отдельности.

Пример сценария xml:

<?xml version="1.0"?>
<Data>
  <data1>1</data1>
  <data2>2</data2>
  <data3>3</data3>
  <Sub_data>
    <sub_data1>0.1111111111111</sub_data1>
    <sub_data2>0.2222222222222</sub_data2>
    ... and so on.

то есть это довольно стандартно.

Теперь мой код выглядит так:

import os
import io
from xml.dom import minidom

#folder where xml files are located
indir = '/foo/bar/docs/'

    masterlist = []

    for root, dirs, filenames in os.walk(indir):
      for f in filenames:
        row = []
        fsock = io.open(indir + f, mode = 'rt', encoding = 'cp1252')
        xmldoc = minidom.parse(fsock)
        ...

и ошибка, которую я получаю:

Traceback (most recent call last): File "kgp_2.py", line 34, in
<module> xmldoc = minidom.parse(fsock) File
"/usr/lib/python2.7/xml/dom/minidom.py", line 1918, in parse return
expatbuilder.parse(file) File
"/usr/lib/python2.7/xml/dom/expatbuilder.py", line 928, in parse
result = builder.parseFile(file) File
"/usr/lib/python2.7/xml/dom/expatbuilder.py", line 211, in parseFile
parser.Parse("", True) xml.parsers.expat.ExpatError: no element found:
line 203, column 1381

Теперь, когда я делаю изменение:

fsock = io.open(indir + filenames[0], mode = 'rt', encoding = 'cp1252')

это работает нормально, то есть открывает первый файл в папке; но я хочу разобрать все файлы в папке. Когда я делаю цикл, например:

m = 0
... in loop:
fsock = io.open(indir + filenames[m], mode = 'rt', encoding = 'cp1252')
...
m = m+1

Я получаю исходную ошибку.

Причина, по которой я использую библиотеку io вместо обычной функции открытия файла, заключается в том, что предыдущая статья о переполнении стека рекомендовала ее. С использованием:

fsock = open(indir + filenames[0])

как и раньше, не получает ошибки, но:

fsock = open(indir + f)

or

#with a loop over m, like above
fsock = open(infir + filenames[m])

получить ту же ошибку, что и выше.

Странная проблема. Когда я печатаю имена файлов, они верны. И они открываются, ошибки нет. Это синтаксический анализатор, который просто не будет анализировать объектные файлы, даже с filenames[m], где m = 0, конечно, это не должно быть проблемой?

РЕДАКТИРОВАТЬ: Разбор документа с помощью python minidom

в этом посте у них была аналогичная проблема, разрешение было использовать

    xmldoc.seek(0)

однако для меня это возвращается

Traceback (most recent call last):
File "kgp_2.py", line 45, in <module>
xmldoc.seek(0)
AttributeError: Document instance has no attribute 'seek'

РЕДАКТИРОВАНИЕ 2: ЭТО БЫЛО РЕШЕНО. ЭТО БЫЛ СЛУЧАЙ ПОВРЕЖДЕНИЯ ВХОДНОГО XML-ФАЙЛА.


person John Douglas    schedule 13.01.2016    source источник
comment
Проверяли ли вы содержимое переменной f/f[m]/filename[m] и т. д. на каждой итерации?   -  person kazbeel    schedule 13.01.2016
comment
Привет, у меня есть. Когда я печатаю имена файлов (это будет переменная f), они верны. (Я также напечатал имя файла [m], и они верны) Если бы там была проблема, я не думаю, что open (f) работал бы, что он и делает.   -  person John Douglas    schedule 13.01.2016
comment
Попробуйте использовать стандартный os.path.join() (doc) присоединиться к indir и файлу.   -  person kazbeel    schedule 13.01.2016
comment
Я сделал это, и я получаю ту же ошибку   -  person John Douglas    schedule 13.01.2016
comment
Вы уверены, что XML-данные, содержащиеся во всех XML-файлах, верны? Возможно, один из них пуст, и вам нужно обработать такое исключение. В любом случае я рекомендую вам использовать xml.etree (doc).   -  person kazbeel    schedule 13.01.2016
comment
Я попробовал это на подмножестве двух файлов xml, которые анализировали себя при отдельной обработке, и все работало нормально. Итак, похоже, что в папке есть файл xml, который пуст или поврежден, как вы предложили. Большое тебе спасибо!   -  person John Douglas    schedule 13.01.2016
comment
Пожалуйста, примите мой ответ как хороший. Я ценю!   -  person kazbeel    schedule 13.01.2016


Ответы (1)


Вы уверены, что XML-данные, содержащиеся во всех XML-файлах, верны? Возможно, один из них пуст, и вам нужно обработать такое исключение. В любом случае я рекомендую вам использовать xml.etree doc.

person kazbeel    schedule 13.01.2016