Можно использовать lxml
для проверки XML-файлов по данной схеме XSD.Как проверить схему XSD с помощью lxml, но игнорировать элементы, которые соответствуют заданному шаблону?
Есть ли способ применить эту проверку в менее строгом смысле, игнорируя все элементы, содержащие специальные выражения?
Рассмотрим следующий пример: Скажем, у меня есть xml_file:
<foo>99</foo>
<foo>{{var1}}</foo>
<foo>{{var2}}</foo>
<foo>999</foo>
Теперь я запустить программу на этом файле, который заменяя {{...}}
-expressions и производит новый файл:
xml_file_new:
<foo>99</foo>
<foo>23</foo>
<foo>42</foo>
<foo>999</foo>
до сих пор я можно использовать lxml
для проверки нового файла XML следующим образом:
from lxml import etree
xml_root = etree.parse(xml_file_new)
xsd_root = etree.parse(xsd_file)
schema = etree.XMLSchema(xsd_root)
schema.validate(xml_root)
Соответствующий пункт в моем примере, что схема ограничивает <foo>
содержимое в целых числах.
Это не было бы возможно применить схему на заранее старой xml_file
, однако, как моя программа делает некоторые другие дорогостоящие задачи, я хотел бы сделать именно это, игнорируя при этом все строки, содержащие любые {{...}}
-expressions:
<foo>99</foo> <!-- should be checked-->
<foo>{{var1}}</foo> <!-- should be ignored -->
<foo>{{var2}}</foo> <!-- should be ignored -->
<foo>999</foo> <!-- should be checked-->
EDIT: Возможный подход решение: Одна из идей было бы определить две схемы
- строгая вторая схема для нового файла, что позволяет только целые числа
- расслабленные схемы для старого файла, позволяя как целые и произвольные строки с
{{..}}
-expressions
Однако, чтобы избежать избыточной задачи сохранения два схем синхронизации один будет нужен способ для создания расслабленного от строгая схема автоматически. Это звучит довольно многообещающе, так как обе схемы имеют одинаковую структуру , только отличающиеся ограничениями на содержание некоторых элементов. Есть ли простая концепция, предлагаемая XSD, которая позволяет просто «наследовать» из одной схемы, а затем «присоединять» дополнительные релаксации к отдельным элементам?
Я не думаю, что это возможно без изменения XML или схемы. Поскольку вы не можете изменить XML, вы можете изменить схему? Потому что вы можете определить тип объединения для '', что позволяет * либо * целые числа, либо * '{{var ...}}'. –
Meyer
Спасибо, я уже ему так. Тем не менее, я все еще хочу использовать строгую целую проверку * после * замен и запрещать '{{...}}' -выражения. Первая проверка - это только предварительное обнаружение проблем для экономии времени, вторая проверка. Чтобы убедиться, что '{{var1}}' заменено целым числом в новом файле, также необходимо исключить случаи, когда '{{var1}}' заменяется на '{{var3}}' в * новом * файле , Здесь, используя ту же схему для обеих проверок, будет дано ложное положительное значение. – flonk
С другой стороны, я боюсь, что использование двух схем (смягченного первого и более строгого второго) приводит к избыточности, особенно потому, что мне нужно очень часто менять и обновлять схему. – flonk