У меня есть проект, который имеет более 100 различных схем и деревьев XML. Чтобы управлять всеми ими и проверять их, я сделал несколько вещей.
1) Я создал файл (т.е. xmlTrees.py), в котором я создал словарь каждого xml и соответствующей схемы, связанной с ним, и путь xml. Это позволило мне иметь одно место для получения xml и схемы, используемой для проверки этого xml.
MY_XML = {'url':'/pathToTree/myTree.xml', 'schema':'myXSD.xsd'}
2) В проекте у нас одинаково много пространств имен (очень сложно управлять). Поэтому я снова создал один файл, который содержал все пространства имен в формате lxml. Тогда в моих тестах и сценариях я просто всегда передавал расширенный набор пространств имен.
ALL_NAMESPACES = {
'namespace1': 'http://www.example.org',
'namespace2': 'http://www.example2.org'
}
3) Для базовой / общей проверки я в итоге создал базовую функцию, которую я мог бы вызвать:
def validateXML(content, schemaContent):
try:
xmlSchema_doc = etree.parse(schemaContent);
xmlSchema = etree.XMLSchema(xmlSchema_doc);
xml = etree.parse(StringIO(content));
except:
logging.critical("Could not parse schema or content to validate xml");
response['valid'] = False;
response['errorlog'] = "Could not parse schema or content to validate xml";
response = {}
# Validate the content against the schema.
try:
xmlSchema.assertValid(xml)
response['valid'] = True
response['errorlog'] = None
except etree.DocumentInvalid, info:
response['valid'] = False
response['errorlog'] = xmlSchema.error_log
return response
В основном любая функция, которая хочет использовать это, должна отправлять содержимое xml и содержимое xsd в виде строк. Это дало мне большую гибкость. Затем я просто поместил эту функцию в файл, где у меня были все мои вспомогательные функции xml.