reponse aux questions + tuto pour se fabriquer son topologi validator (valider un XML avec un Schematron inclu dans un Schema)
samy sayag <[email protected]>
| Newsgroups | gmane.text.xml.french.tech |
|---|---|
| Message-ID | <[email protected]> |
Bonjour à tous,
Etant donné ce qui suit, et le fait que je sois débutant en XML, jinvite des gens bien plus calés que moi à réagir sur ce que jexplique à des débutant avec des mots de débutant. Les corrections seront les bienvenues
Je me réponds moi-même au problèmes (voir pour cela) :
1/ http://xmlfr.org/listes/xml-tech/2006/06/0008.html
2/ http://xmlfr.org/listes/xml-tech/2006/06/0011.html
Problèmes :
Jai essaye de comprendre pourquoi cétait si difficile de répondre à ma propre question à laides Schema XML en tournant et retournant toutes les solutions à laide de <xs:all > ou <xs :choice> et en jouant sur les occurrences mais alors que tout marchait pour le mieux (javais trouvé une suite de modèles de contenu qui semblait valide , un peu verbeux mais valide bref) je tombe sur une dernière erreur que je croyais bénigne (voir le lien si dessus) et qui pour les petits débutant dans mon genre se révèle en fait impossible à surmonter :
Comment rendre déterministe un modèle de contenu non déterministe.
Voir (pour quelques solutions simples à des problèmes simples) lensemble des chapitres 7.4
de XML Schema (OReilly, Eric VDV) où E.VDV touche le problème du doigt mais si vous voulez vraiment une explication profonde de la nature du problème inhérente à la façon même dont à été conçu XML Schema consultez la définition (et beaucoup plus
) de ce que lon appel lambiguïté pour un parseur ou processeur qui implémente même correctement la norme à :
http://books.xmlschemata.org/relaxng/relax-CHP-16.html
qui est le lien de : RELAX NG, Eric van der Vlist is published by O'Reilly & Associates (ISBN: 0596004214)
(La totalité du bouquin est dailleurs disponible on-line !!!!??? cest cool, moi jaime ça
)
De manière générale vous verrez quil y a tout un tas de questions auxquelles XML Schema ne répond absolument pas :
- les problèmes liés à loccurrence plurielle déléments encadrés par du <xs:all > </xs:all > (chaque élément doit être présent au plus une fois, malheur !!!)
- ou si vous voulez vous amuser à implémenter une règles du type : je validerais mon document si la somme des valeur incluses dans telles balises fait tant.
Et tout un tas dautres qui sont for bien expliqués dans le chapitre dont le lien figure ci-dessus.
Solution :
Bon alors visiblement, aux problèmes de structure il y a deux réponses :
- RelaxNG que je ne connaît absolument pas (mais jentends bien combler cette lacune).
- Schematron qui est plus abordable mais il na pas lair davoir exactement le même objectif même si pour ce que je veux en faire cela revient visiblement au même.
Concrètement comment on fait ?
On inclut du Schematron dans un document de grammaire type Schema ou RelaxNG.
Pour voir à quoi cela ressemble :
Avec du RelaxNG :
http://www.xml.com/pub/a/2004/02/11/relaxtron.html?page=1
Avec du Schema :
http://www.topologi.com/public/Schtrn_XSD/Paper.html
Cest le même type qui a fait les deux et cest très bien fait.
Pour ceux qui souhaite approfondir le sujet RelaxNG et Schematron voilà quelques liens qui mont été pratique.
RelaxNG :
Il y a de la doc à :
http://www.relaxng.org/
qui concentre ce que lon peut trouver dintelligible pour un débutant
Des implémentation de parser qui valide un xml contre une « <grammar> » NG.
Différente implémentations existe pour valider un document XML par programmation mais cela dépend évidemment du langage que vous utilisé pour ce faire.
PHP (5 mais faut vérifier ça
.) : http://wiki.cc/php/Dom_validation
JAVA : http://www.sun.com/software/xml/developers/schematronaddon/
VB : ça ctait pour moi jen ai besoin mais cest dur à trouver
.
http://www.geocities.co.jp/SiliconValley-Bay/4639/vbrelaxng/vbrelaxng.html
cest du fait maison (et faut tester jen sait rien
) mais comme je ne crois pas me tromper en disant que RelaxNG na pas été implémenter par Microsoft ça pourra toujours vous servir.
Schematron :
La référence :
http://xml.ascc.net/resource/schematron/schematron.html
Un tuto très bien fait de chez ZVON
http://www.zvon.org/xxl/SchematronTutorial/General/contents.html
Avec du VBA/VB si vous avez un XML Schema et des notion de Schematron et que vous voulez valider un document :
Il y a dabord un logiciel dont il a été question sur ce forum :
Le Topologi validator (il fait inclusion de Schematron dans RelaxNG ou Schema et sans doute dautres choses mais je ne lutilise que pour ça pour linstant).
Il est gratuit et disponible à :
http://www.topologi.com/products/validator/index.html
allez y par ce lien parce que depuis lindex du site cest particulièrement introuvable
Si vous voulez le programmez :
Il faut :
1- Préparer vous un fichier xml et sa grammaire avec un schematron correctement inclus dedans (vérifiez dans topologi validator que vous avez ce vous voulez)
2- piquer les fichiers (voir ci dessous) du répertoire (après installation de Topologi validator) :
C:\Program Files\Topologi\Schematron Validator\Scripts (vous les mettez dans le dossier de votre appli par exemple)
XSD2Schtrn.xsl (excise le Schematron de votre XML Schema
et vous cree un output en txt que vous convertissez en .sch)
schematron-diagnose.xsl qui necessite egalement skeleton1-5.xsl
(transforme votre schematron en validateur.xslt eh oui un autre
fichier...)
puis on confrontera l'instance XML au validateur
pour obtenir le resultat de test de structure
et enfin on pourra test l'insatnce xml par rapport à son schema
3- Impliquez dans le projet les références (ou librairies
)
a. ScriptingRuntime (pour la manipulation/lecture/ecriture de fichier avec mon code mais ya dautre manière de faire.)
b. MSXML alors là je sais que si vous êtes en VBA : la 4.0 et 5.0 ça marche mais curieusement la 6.0 NE MARCHE PAS avec VBA. Je ne doute pas que toute marche avec VB sinon ça sert pas à grand-chose
mais cela nà pas été vérifier par mes soins. Cest téléchargeable avec une recherche depuis la MSDN par exemple
bref pas dur à trouver.
4- Ecrivez les procédures suivantes dans un module (cest du VBA pour le VB ça doit pas êtres très différent)
Const nom_fichier_schema = "adresse + nom_fichier.xsd"
Const nom_fichier_xml = " adresse + nom_fichier.xml"
Const schematronExtracting = " adresse + nom_fichier.xsl"
Const scheamtronDiagnostic = " adresse + nom_fichier.xsl"
Const nom_fichier_erreur = " adresse + nom_fichier.txt"
Private Sub ecritureFichierFromString(contenu As String, _
ByVal nom_fichier As String)
Dim fs, objFile As Object
Dim compteur As Integer
Set fs = CreateObject("Scripting.FileSystemObject")
Set objFile = fs.CreateTextFile(nom_fichier, True, True)
objFile.WriteLine (contenu)
Set objFile = fs.GetFile(nom_fichier)
objFile.Attributes = vbNormal
' MsgBox (objFile.attributes)
Set objFile = Nothing
Set fs = Nothing
End Sub
Public Function XSLProcessing(ByVal cheminDocXML As String, _
ByVal cheminXSLT As String) As Variant
Dim XMLDoc As New MSXML2.DOMDocument40
Dim XSLTDoc As New MSXML2.FreeThreadedDOMDocument40
Dim XSLTTemplate As New MSXML2.XSLTemplate40
Dim XSLTProcessor As MSXML2.IXSLProcessor
Dim fichierSortie As String
XMLDoc.async = False
XMLDoc.Load (cheminDocXML)
XSLTDoc.async = False
XSLTDoc.Load (cheminXSLT)
Set XSLTTemplate.stylesheet = XSLTDoc
Set XSLTProcessor = XSLTTemplate.createProcessor
XSLTProcessor.input = XMLDoc
XSLTProcessor.transform
' MsgBox (XSLTProcessor.output)
XSLProcessing = XSLTProcessor.output
End Function
Public function validation_xsd() as boolean
Dim objSchemaCache As New MSXML2.XMLSchemaCache40
objSchemaCache.Add "", nom_fichier_schema
Dim objXMLDoc As New MSXML2.DOMDocument40
Set objXMLDoc.Schemas = objSchemaCache
objXMLDoc.async = False
objXMLDoc.Load nom_fichier_xml
vous pouvez catcher lerreur avec lobjet suivant qui à différente propriétés
très instructive
objXMLDoc.parseError
par exemple
If objXMLDoc.parseError.errorCode <> 0 Then
validation_xsd = 0
Else
validation_xsd = 1
End if
End Function
et vous pouvez tester avec ce script suivant :
Public Sub validation()
Dim cheminExtractSchematron, _
cheminDiagnosticSchematron, _
cheminValidateurXSLT, _
cheminXMLSchema, _
cheminSchematron, _
cheminXML, _
cheminResTestStructureXML As String
Dim contenuValidateur, contenuResTestStructureXML, contenuSchematron As String
cheminExtractSchematron = schematronExtracting
cheminDiagnosticSchematron = scheamtronDiagnostic
cheminXMLSchema = nom_fichier_schema
cheminXML = nom_fichier_xml
cheminSchematron = ActiveWorkbook.Path & "\" & "Schematron.sch"
cheminResTestStructureXML = ActiveWorkbook.Path & "\" & "resultaTestStructure.txt"
cheminValidateurXSLT = ActiveWorkbook.Path & "\" & "validateur.xsl"
'extraction du Schematron depuis le SchemaXML
contenuSchematron = CStr(XSLProcessing(cheminXMLSchema, cheminExtractSchematron))
'ecriture du fichier ...
Call ecritureFichierFromString(contenuSchematron, cheminSchematron)
'creation du XSLT qui confrontera le Schematron au XML
contenuValidateur = CStr(XSLProcessing(cheminSchematron, cheminDiagnosticSchematron))
'ecriture du fichier ...
Call ecritureFichierFromString(contenuValidateur, cheminValidateurXSLT)
'realisation du test XSLT+Schematron avec le XML
contenuResTestStructureXML = CStr(XSLProcessing(cheminXML, cheminValidateurXSLT))
'realisation du test sur le XML Schema
contenuResTestStructureXML = contenuResTestStructureXML & vbCrLf & _
"la valeur du test XML Schema est : " & vbCrLf & _
CStr(validation_xsd(nom_fichier_xml, nom_fichier_schema))
'ecriture du fichier cheminResTestStructureXML
Call ecritureFichierFromString(contenuResTestStructureXML, cheminResTestStructureXML)
'MsgBox (ActiveWorkbook.Path)
'MsgBox (CStr(contenuSchematron))
'MsgBox (CStr(contenuValidateur))
'MsgBox (CStr(contenuResTestStructureXML))
'MsgBox (validation_xsd(nom_fichier_xml, nom_fichier_schema))
End Sub
Annexe : jai teste avec ce XML et cette grammaire schematronnée :
Xml :
<?xml version="1.0" encoding="UTF-8"?>
<AAA xmlns:sch="http://www.ascc.net/xml/schematron" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="C:\Documents and Settings\samuel\Bureau\outil_statistiques\XML\ambiguite_shematron\ambigu1.xsd">
<BBB>
<CCC>0</CCC>
<CCC>-1</CCC>
<CCC>0</CCC>
</BBB>
</AAA>
Schema
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:sch="http://www.ascc.net/xml/schematron" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:simpleType name="CCCType">
<xs:restriction base="xs:byte">
<xs:enumeration value="0"/>
<xs:enumeration value="-1"/>
</xs:restriction>
</xs:simpleType>
<xs:element name="BBB">
<xs:annotation>
<xs:appinfo>
<sch:pattern name="Sum inf -1">
<sch:rule context="//BBB">
<!-- <sch:assert test="sum(//CCC) = 0">0 result</sch:assert>-->
<sch:assert test="sum(//CCC) < 0">under 0 result </sch:assert>
</sch:rule>
</sch:pattern>
</xs:appinfo>
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element name="CCC" type="CCCType" maxOccurs="3"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="AAA">
<xs:complexType>
<xs:sequence>
<xs:element ref="BBB"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
__________________________________________________
Do You Yahoo!?
En finir avec le spam? Yahoo! Mail vous offre la meilleure protection possible contre les messages non sollicités
http://mail.yahoo.fr Yahoo! Mail