LINUX.ORG.RU

[python] Нужен xml парсер с валидацией.

 


0

1

То есть я в начале хочу описать структуру xml в каком-то виде:

  • какой элемент где встречается (какой у него родитель)
  • сколько элементов может быть (1, несколько, обязательно ли наличие хотя бы одного)
  • содержит ли элемент значение, какое (число, строка, одна из возможных строк)
  • и прочее

далее я кормлю этому xml и иду по полученной структуре. Если что-то не так. то выбрасываем исключение. Я не хочу на каждом шаге писать код вида

 a = node.value
 if a is None:
   raise ...;
 if a not in (...):
   raise ...;
 try:
   a = int(a)
 except:
   raise ...;

в идеале валидация должна идти вместе с парсингом, чтоб я мог сделать следующее: * если элементе a содержит строку 111, то должен быть обязательно элемента а_a * если элемент a содержит строку 222, то должен быть обязательно элемент a_b

Зачем это надо? Необходимо парсить xml сложно вида. Причем мы хотим парсить ее не целиком (документ там о ее содержании более 300 страниц), да и стандарт они меняют часто. Надо, чтоб если мы встретили что-то неожиданное, мы сразу падали.

★★★★

Последнее исправление: namezys (всего исправлений: 1)

Ответ на: комментарий от kelyar

Ну сделаю. Дальше то что с ним делать? Есть та штука, что из xml+xsd выдаст, например, dict?

namezys ★★★★
() автор топика

lxml может без проблем валидировать по схеме. Если схем несколько, тогда надо прыгать.

baverman ★★★
()

Причем мы хотим парсить ее не целиком (документ там о ее содержании более 300 страниц)

Насколько большие документы, в мегабайтах? AFAIK, валидация применима только для всего дерева. Или можно отдельные ноды дополнять до валидного документа, но это гемморой.

baverman ★★★
()
Ответ на: комментарий от baverman

Ну. Пару мегабайт. Можно грузить целиком и парстить в памяти. Ну такую «условную» валидацию уж проверю в годе, если надо будет.

namezys ★★★★
() автор топика
Ответ на: комментарий от namezys

Пару мегабайт.

Тьфу, тогда ничего не стоит сначала валидировать, а потом уже спокойненько парсить (не забываем про XPath), не опасаясь неожиданностей.

baverman ★★★
()

lxml умеет парсить с валидацией по схеме XML Schema или Relax NG. Чего же боле?

shylent
()
Ответ на: комментарий от baverman

Я не хочу, чтоб валидериование и парсинг были различными процессами. В этом случае приходится поддерживать в синхронном состоянии парсер и валидатор. А надо, чтоб он валидировал по схеме и по ней же парсил.

namezys ★★★★
() автор топика
Ответ на: комментарий от namezys

В этом случае приходится поддерживать в синхронном состоянии парсер и валидатор

Это как? Или ты хочешь *генерить* парсер по схеме? Так опять не вижу проблем с предварительной валидацией.

baverman ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.