Gli standard per rappresentare schemi per documenti XML, in particolare XML Schema. Analisi dei software disponibili per la validazione e la decodifica XML. Sviluppo di una nuova libreria Python per decodificare XML secondo schemi XML Schema.
internazionale • Si trova a Trieste • Fondata nel 1978 • Ricerca e didattica in 3 aree: – Fisica – Matematica – Neuroscienze • Circa 260 studenti di PhD • Attivati 12 corsi di PhD • 2 Masters in: – Comunicazione della Scienza – High Performance Computing
Research in Electronic Structure, Simulation, and Optimization” • Suite integrata di programmi di simulazione a livello atomico basato su DFT, pseudo-potenziali e onde piane • Strutturato su alcuni programmi di simulazione progettati per interoperare anche con altri software • Free open source software (licenza GPL2) • Iniziativa coordinata dalla Quantum ESPRESSO Foundation, con la partecipazione di SISSA, EPFL, ICTP, CINECA, CNR, University of North Texas e con molti partner in Europa e in tutto il mondo
Fortran/C • 53 sviluppatori registrati • 1000+ utenti registrati • 4000+ download per ogni nuova release • 3 siti web • 1 mailing list con 2500+ messaggi/anno • 30 scuole e workshop dal 2002 con 1200+ partecipanti
SGML – SGML ideato per codifiche complete di lungo periodo • Pensato anche per sostituire HTML ... non è stato così: – HTML 5 – Sintassi e semantica associata • Ricco di linguaggi di manipolazione: – XPath: selezionare nodi di un documento XML – XSLT: Trasformazione di documenti XML – XQuery: ricerca in documenti XML
Elementi e attributi che possono essere inclusi – Ordine e ripetizione degli elementi – Tipi per elementi e attributi – Predicati sul contenuto – Vincoli su tipi, attributi, elementi • Principali linguaggi per definire schemi XML: – Grammar-based (struttura, forma e sintassi) • Document Type Definition (DTD) • XML Schema • Relax NG (relaxing) – Rule-based (relazioni tra i dati) • Schematron
• PRO: – Relativamente semplice e compatto – Ampiamente supportato • CONTRO: – Supporto ai tipi di dati e vincoli molto limitato – Non supporta nativamente i namespace – Non ha una sintassi XML <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE vehicles [ <!ELEMENT vehicles (cars|bikes)*> <!ELEMENT cars (car)*> <!ELEMENT car (#PCDATA)> <!ATTLIST car make CDATA #REQUIRED model CDATA #REQUIRED> <!ELEMENT bikes (bike)*> <!ELEMENT bike (#PCDATA)> <!ATTLIST bike make CDATA #REQUIRED model CDATA #REQUIRED> ]> <vehicles> <cars> <car make="Porsche" model="911" /> <car make="Porsche" model="911" /> </cars> <bikes> <bike make="Harley-Davidson" model="WL" /> <bike make="Yamaha" model="XS650" /> </bikes> </vehicles>
PRO: – Più semplice rispetto a XML Schema – Lo schema del documento – Migliore supporto per modelli non ordinati – Disponibile anche in formato compatto non-XML • CONTRO: – Non ha tipi di dato predefiniti – Poco supporto per definire tipi <grammar ns="" xmlns="http://relaxng.org/ns/structure/1.0" datatypeLibrary="http://www.w3.org/2001/XMLSchema- datatypes"> <start> <element name="vehicles"> <element name="cars"> <oneOrMore> <element name="car"> <attribute name="make"> <data type="NCName"/> </attribute> <attribute name="model"> <data type="integer"/> </attribute> </element> </oneOrMore> </element> <element name="bikes"> <oneOrMore> <element name="bike"> <attribute name="make"> <data type="NCName"/> </attribute> <attribute name="model"> <data type="NCName"/> </attribute> </element> </oneOrMore> </element> </element> </start> </grammar>
2016) – XML valido se non viola regole <schema xmlns="http://purl.oclc.org/dsdl/schematron"> <title>Vehicles</title> <pattern id="vehicles-rules"> <rule context="vehicles"> <assert test="cars">No list of cars!</assert> <assert test="bikes">No list of bikes!</assert> </rule> <rule context="vehicles:cars"> <report test="car">You have a car!</report> </rule> <rule context="vehicles:bikes"> <report test="bike">You have a bike!</report> </rule> </pattern> </schema> • PRO – Facile da imparare e usare – Espressività e flessibilità • CONTRO – Non ha modello di dati – Niente tipi né defaults – Impatto errori nello schema
di interoperabilità delle implementazioni – XSD 1.1 da implementare Complicato!? – Eventualmente il Primer W3C: http://www.w3.org/TR/2004/REC-xmlschema-0-20041028/ – Poi un libro buono (ce ne sono pochi) Alcuni errori sono anche difficili da interpretare: • “When <simpleContent> is used, the base type must be a complexType whose content type is simple, or, only if restriction is specified, a complex type with mixed content and emptiable particle, or, only if extension is specified, a simple type.”
soddisfi entrambe le condizioni: – sia ben formato (well-formed) – sia valido rispetto ad un determinato schema XML schema (.xsd) well-formed XML instance (.xml) XML Schema validator XML instance is valid/invalid
XML Schema – Esprime un documento XML come modello di dati – Documento XML come oggetto • PSVI contiene – Vocabolario (nomi di elementi e attributi) – Il modello di contenuto – I tipi di dati
di GNOME – Scritta in C – Implementazione XSD 1.0 quasi completa – xmllint (tool di libxml2) – lxml (Python bindings di libxml2) • Xerces – Supportato dalla Apache Foundation – Disponibile per Java, C++, Perl – Implementa completamente XSD 1.0 – Usato in molti software (PyCharm)
HTML • Rispetto alla libreria standard: – Interfaccia Element Tree estesa – Più veloce – Supporto XPath completo – Validazione (DTD, XML Schema, Relax NG) • PSVI ? – Non disponibile dopo la validazione – Non nelle C-API (file etreepublic.pxd) “lxml is the most feature-rich and easy-to-use library for processing XML and HTML in the Python language.”
io >>> f = io.StringIO("""<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> ... <xs:element name="A" type="TipoA"/> ... <xs:complexType name="TipoA"> ... <xs:sequence> ... <xs:element name="B" type="xs:string"/> ... </xs:sequence> ... </xs:complexType> ... </xs:schema> ... """) >>> xs_document = etree.parse(f) >>> xs = etree.XMLSchema(xs_document) >>> xml_document = etree.fromstring("<A><B></B></A>") >>> xs.validate(xml_document) True >>> xml_document = etree.fromstring("<A><C></C><D/></A>") >>> xs.validate(xml_document) False >>> xs.assertValid(xml_document) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "src/lxml/lxml.etree.pyx", line 3491, in lxml.etree._Validator.assertValid (src/lxml/lxml.etree.c:186663) lxml.etree.DocumentInvalid: Element 'C': This element is not expected. Expected is ( B )., line 1 >>> xs.error_log <string>:1:0:ERROR:SCHEMASV:SCHEMAV_ELEMENT_CONTENT: Element 'C': This element is not expected. Expected is ( B ). >>>
libreria proprietaria • Standardizzare l’uso di XML: 1.Fortran XML library (FoX) 2.Uso di schemi XSD per descrivere l’input e l’output • Scelto XML Schema: – Tipi di dato predefiniti – Orientato alle strutture dati – Già usato da altri sw del gruppo &CONTROL calculation='relax' dipfield=.false. disk_io='low' dt=20.0 etot_conv_thr=0.0001 forc_conv_thr=0.001 input_xml_schema_file='Al001_relax_bfgs.xml' iprint=100000 max_seconds=10000000 outdir='/tmp/espresso/tempdir' prefix='Al' pseudo_dir='/tmp/espresso/pseudo' restart_mode='from_scratch' title='' tprnfor=.false. tstress=.false. verbosity='high' wf_collect=.false. / &SYSTEM degauss=0.05 ecutwfc=12.0 force_symmorphic=.false. ibrav=0 input_dft='PZ' lspinorb=.false. nat=7 no_t_rev=.false. noinv=.false. noncolin=.false. nosym=.false. nosym_evc=.false. nspin=1 /
PW (2016) – Phonon (2016) – Neb (2017) – ... • Uso dello schema: – Convertire l’input XML nel formato namelist Fortran – Strutturare l’output XML – Costruire codice Fortran per i dati di output – Validare i dati prodotti ...
corrispondenza biunivoca tra Input XML e Namelist – Alcuni parametri namelist sono funzione di più parametri XML – Python per il post-processing di QE • Decomposizione del problema: XML to Namelist translator PW XML Input PW input file (namelists and cards) XML Schema Decoder XML Python dictionary Namelist translator Fortran namelist qes.xsd
definire • Modifiche agli schemi esistenti • Complessità parsing XSD • Codice testato anche con altri schemi • Validatore lxml non utile per decodifica ... Convertitore XML + PyCon 7 (jsonschema) xmlschema
recent call last): File "<stdin>", line 1, in <module> File "/usr/lib/python3.5/site-packages/xmlschema/schema.py", line 385, in validate raise error xmlschema.exceptions.XMLSchemaValidationError: failed validating 'C' with <XsdGroup 'None' at 0x7fc7f5d45d68>. Reason: element not in schema! Schema: <xs:sequence xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="B" type="xs:string" /> </xs:sequence> Instance: <C />
>>> [e for e in xs.iter_errors("<A><C></C></A>")] [XMLSchemaValidationError(<XsdGroup 'None' at 0x7fc7f5d45d68>, 'C', 'element not in schema!', <Element 'C' at 0x7fc7f430ab88>, <Element '{http://www.w3.org/2001/XMLSchema}sequence' at 0x7fc7f430a408>), XMLSchemaValidationError(<XsdElement 'B' at 0x7fc7f5d45da0>, <Element 'A' at 0x7fc7f430aae8>, "tag 'B' expected.")] >>>