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, j’invite des gens bien plus calés que moi à réagir sur ce que j’explique à 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 :
   
  J’ai essaye de comprendre pourquoi c’était si difficile de répondre à ma propre question à l’aides Schema XML en tournant et retournant toutes les solutions à l’aide de  <xs:all > ou <xs :choice> et en jouant sur les occurrences mais alors que tout marchait pour le mieux (j’avais 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) l’ensemble des chapitres 7.4…de XML Schema (O’Reilly, 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 l’on appel l’ambiguï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 d’ailleurs disponible on-line !!!!??? c’est cool, moi j’aime ça…)
   
  De manière générale vous verrez qu’il y a tout un tas de questions auxquelles XML Schema ne répond absolument pas :
  -         les problèmes liés à l’occurrence 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 d’autres 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 j’entends bien combler cette lacune).
  -         Schematron qui est plus abordable  mais il n’a pas l’air d’avoir 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
  C’est le même type qui a fait les deux et c’est très bien fait.
   
  Pour ceux qui souhaite approfondir le sujet RelaxNG et Schematron voilà quelques liens qui m’ont été pratique.
   
  RelaxNG :
   
  Il y a de la doc à :
  http://www.relaxng.org/
  qui concentre ce que l’on peut trouver d’intelligible 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 c’tait pour moi j’en ai besoin mais c’est dur à trouver….
  http://www.geocities.co.jp/SiliconValley-Bay/4639/vbrelaxng/vbrelaxng.html
  c’est du fait maison (et faut tester j’en sait rien…) mais comme je ne crois pas me tromper en disant que RelaxNG n’a 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 d’abord 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 d’autres choses mais je ne l’utilise que pour ça pour l’instant). 
  Il est gratuit et disponible à :
  http://www.topologi.com/products/validator/index.html
  allez y par ce lien parce que depuis l’index du site c’est 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 y’a d’autre 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. C’est téléchargeable avec une recherche depuis la MSDN par exemple…bref pas dur à trouver.
  4-     Ecrivez les procédures suivantes dans un module (c’est 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” l’erreur avec l’objet 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 : j’ai 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) &lt; 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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.