xmlstarlet является инструментом командной строки, который сделает это и больше:
$ xmlstarlet val --help XMLStarlet Toolkit: Validate XML document(s) Usage: xmlstarlet val[ ... ] where -w or --well-formed - validate well-formedness only (default) -d or --dtd - validate against DTD -s or --xsd - validate against XSD schema -E or --embed - validate using embedded DTD -r or --relaxng - validate against Relax-NG schema -e or --err - print verbose error messages on stderr -b or --list-bad - list only files which do not validate -g or --list-good - list only files which validate -q or --quiet - do not list files (return result code only) NOTE: XML Schemas are not fully supported yet due to its incomplete support in libxml2 (see http://xmlsoft.org) XMLStarlet is a command line toolkit to query/edit/check/transform XML documents (for more information see http://xmlstar.sourceforge.net/)
Использование в Вашем случае было бы вроде:
xmlstarlet val --xsd your_schema.xsd your_file.xml
Если вы хотите изменить атрибуты dict до создания класса или изменить базовый кортеж, вы должны использовать __ new __
. К тому времени, когда __ init __
увидит аргументы, объект класса уже существует. Кроме того, вы должны использовать __ new __
, если хотите вернуть что-то, кроме вновь созданного класса рассматриваемого типа.
С другой стороны, к моменту выполнения __ init __
класс действительно существует. Таким образом, вы можете делать такие вещи, как давать ссылку на только что созданный класс на один из его объектов-членов.
Edit : изменена формулировка, чтобы прояснить, что под «объектом» я имею в виду класс-объект.
Вы можете увидеть полную запись в официальных документах , но в основном, __ new __
называется перед , новый объект создан (с целью его создания) и __ init __
вызывается после того, как создается новый объект (с целью его инициализации).
Использование __ new __
позволяет использовать такие приемы, как кэширование объектов (всегда возвращает один и тот же объект для одних и тех же аргументов, а не создает новые) или создание объектов другого класса, чем запрошенный (иногда используется для возврата более конкретных подклассов запрошенного класса). Обычно, если вы не делаете что-то довольно странное, полезность __ new __
ограничена. Если вам не нужно использовать такие уловки, используйте __ init __
.
Вы можете реализовать кэширование. Person («Джек»)
всегда возвращает новый объект во втором примере, в то время как вы можете искать существующий экземпляр в первом примере с помощью __ new __
(или не возвращать ничего, если хотите).