Partage
  • Partager sur Facebook
  • Partager sur Twitter

Accès à mon schéma XSD

    17 juillet 2019 à 14:09:09

    Bonjour, 

    Je suis confronté au problème suivant : je souhaite valider un fichier XML à l'aide d'un schéma XSD mais je n'arrive pas à accéder au XSD. 

    Ma solution contient deux projets : une class library qui contient le schéma et une Android app (Xamarin) qui utilise le code ci-dessous.

     XmlReaderSettings settings = new XmlReaderSettings();
     settings.Schemas.Add("http://tempuri.org/XMLSchema.xsd", "EpasAll.xsd");

    Et je ne sais pas exactement quoi mettre comme paramètres de la méthode Add. Ça demande : string targetNamespace, string schemaUri. 

    Le targetNamespace est à priori le bon, je le prends de l'en-tête de mon schéma. Mais ce qui me semble étrange c'est que j'ai ".xsd" à la fin. En effet, dans tous les exemples que je trouvais il n'y avait jamais d'extension (par exemple avec ce targetNamespace ça s'arrêterait à XMLSchema).

    <?xml version="1.0" encoding="utf-8"?>
    <xs:schema targetNamespace="http://tempuri.org/XMLSchema.xsd"
        elementFormDefault="qualified"
        xmlns="http://tempuri.org/XMLSchema.xsd"
        xmlns:mstns="http://tempuri.org/XMLSchema.xsd"
        xmlns:xs="http://www.w3.org/2001/XMLSchema"

    Pour ce qui est du schemaUri je ne sais pas non plus quoi mettre... Juste avec le nom du fichier ça ne fonctionne pas et avec l'adresse complète ça ne fonctionne pas non plus.

    Ma méthode de validation contient un try catch et ça rentre dans le try, mais à la ligne settings.Schemas etc ça lance une exception. J'ai mis un StackTrace, je vous le partage si ça peut aider... Pour moi c'est obscur ! ^^

    07-17 13:10:53.986 I/mono-stdout(11741):   at System.IO.FileStream..ctor (System.String path, System.IO.FileMode mode, System.IO.FileAccess access, System.IO.FileShare share, System.Int32 bufferSize, System.Boolean anonymous, System.IO.FileOptions options) [0x001b7] in <d4a23bbd2f544c30a48c44dd622ce09f>:0   at System.IO.FileStream..ctor (System.String path, System.IO.FileMode mode, System.IO.FileAccess access, System.IO.FileShare share, System.Int32 bufferSize, System.Boolean anonymous, System.IO.FileOptions options) [0x001b7] in <d4a23bbd2f544c30a48c44dd622ce09f>:0 
    
    07-17 13:10:53.989 I/mono-stdout(11741):   at System.IO.FileStream..ctor (System.String path, System.IO.FileMode mode, System.IO.FileAccess access, System.IO.FileShare share, System.Int32 bufferSize) [0x00000] in <d4a23bbd2f544c30a48c44dd622ce09f>:0 
      at System.IO.FileStream..ctor (System.String path, System.IO.FileMode mode, System.IO.FileAccess access, System.IO.FileShare share, System.Int32 bufferSize) [0x00000] in <d4a23bbd2f544c30a48c44dd622ce09f>:0 
      at (wrapper remoting-invoke-with-check) System.IO.FileStream..ctor(string,System.IO.FileMode,System.IO.FileAccess,System.IO.FileShare,int)
      at System.Xml.XmlDownloadManager.GetStream (System.Uri uri, System.Net.ICredentials credentials, System.Net.IWebProxy proxy, System.Net.Cache.RequestCachePolicy cachePolicy) [0x00018] in <2e0be0f40ce3481a960168d707f5b5f1>:0 
      at System.Xml.XmlUrlResolver.GetEntity (System.Uri absoluteUri, System.String role, System.Type ofObjectToReturn) [0x00032] in <2e0be0f40ce3481a960168d707f5b5f1>:0 
      at System.Xml.XmlTextReaderImpl.FinishInitUriString () [0x0004c] in <2e0be0f40ce3481a960168d707f5b5f1>:0 
      at System.Xml.XmlTextReaderImpl..ctor (System.String uriStr, System.Xml.XmlReaderSettings settings, System.Xml.XmlParserContext context, System.Xml.XmlResolver uriResolv07-17 13:10:53.990 I/mono-stdout(11741):   at (wrapper remoting-invoke-with-check) System.IO.FileStream..ctor(string,System.IO.FileMode,System.IO.FileAccess,System.IO.FileShare,int)
    
    er) [0x000c7] in <2e0be0f40ce3481a960168d707f5b5f1>:0 
      at System.Xml.XmlReaderSettings.CreateReader (System.String inputUri, System.Xml.XmlParserContext inputContext) [0x0003b] in <2e0be0f40ce3481a960168d707f5b5f1>:0 
      at System.Xml.XmlReader.Create (System.String inputUri, System.Xml.XmlReaderSettings settings, System.Xml.XmlParserContext inputContext) [0x0000a] in <2e0be0f40ce3481a960168d707f5b5f1>:0 
      at System.Xml.XmlReader.Create (System.String inputUri, System.Xml.XmlReaderSettings settings) [0x00000] in <2e0be0f40ce3481a960168d707f5b5f1>:0 
      at System.Xml.Schema.XmlSchemaSet.Add (System.String targetNamespace, System.String schemaUri) [0x00065] in <2e0be0f40ce3481a960168d707f5b5f1>:0 
      at API_Xamarin_Class_Library.ParserUtils.XmlUtils.IsMessageValid (System.IO.Stream inputStream) [0x00020] in C:\Users\...\API_Xamarin_Class_Library\ParserUtils\XmlUtils.cs:88 
    07-17 13:10:53.990 I/mono-stdout(11741):   at System.Xml.XmlDownloadManager.GetStream (System.Uri uri, System.Net.ICredentials credentials, System.Net.IWebProxy proxy, System.Net.Cache.RequestCachePolicy cachePolicy) [0x00018] in <2e0be0f40ce3481a960168d707f5b5f1>:0 
    07-17 13:10:53.990 I/mono-stdout(11741):   at System.Xml.XmlUrlResolver.GetEntity (System.Uri absoluteUri, System.String role, System.Type ofObjectToReturn) [0x00032] in <2e0be0f40ce3481a960168d707f5b5f1>:0 
    07-17 13:10:53.990 I/mono-stdout(11741):   at System.Xml.XmlTextReaderImpl.FinishInitUriString () [0x0004c] in <2e0be0f40ce3481a960168d707f5b5f1>:0 
    07-17 13:10:53.990 I/mono-stdout(11741):   at System.Xml.XmlTextReaderImpl..ctor (System.String uriStr, System.Xml.XmlReaderSettings settings, System.Xml.XmlParserContext context, System.Xml.XmlResolver uriResolver) [0x000c7] in <2e0be0f40ce3481a960168d707f5b5f1>:0 
    07-17 13:10:53.990 I/mono-stdout(11741):   at System.Xml.XmlReaderSettings.CreateReader (System.String inputUri, System.Xml.XmlParserContext inputContext) [0x0003b] in <2e0be0f40ce3481a960168d707f5b5f1>:0 
    07-17 13:10:53.991 I/mono-stdout(11741):   at System.Xml.XmlReader.Create (System.String inputUri, System.Xml.XmlReaderSettings settings, System.Xml.XmlParserContext inputContext) [0x0000a] in <2e0be0f40ce3481a960168d707f5b5f1>:0 
    07-17 13:10:53.991 I/mono-stdout(11741):   at System.Xml.XmlReader.Create (System.String inputUri, System.Xml.XmlReaderSettings settings) [0x00000] in <2e0be0f40ce3481a960168d707f5b5f1>:0 
    07-17 13:10:53.991 I/mono-stdout(11741):   at System.Xml.Schema.XmlSchemaSet.Add (System.String targetNamespace, System.String schemaUri) [0x00065] in <2e0be0f40ce3481a960168d707f5b5f1>:0 
    07-17 13:10:53.991 I/mono-stdout(11741):   at API_Xamarin_Class_Library.ParserUtils.XmlUtils.IsMessageValid (System.IO.Stream inputStream) [0x00020] in C:\Users\...\API_Xamarin_Class_Library\ParserUtils\XmlUtils.cs:88 


    Si quelqu'un peut m'aider je le remercie ^^

    -
    Edité par ThibaudBurki 22 juillet 2019 à 9:38:57

    • Partager sur Facebook
    • Partager sur Twitter
      28 août 2019 à 15:25:10

      N'utilisez pas les try/catch n'importe comment.

      Ne catchez que ce que vous êtes en mesure de traiter (logguer n'est pas traiter).

      Utilisez correctement le débogueur pour ne pas avoir à catcher tout et n'importe quoi.

      Le débogueur permet d'avoir bien plus d'information que cette StackTrace horrible.

      Vos interrogation montre que vous n'avez absolument pas compris comment fonction la validation des schémas, et c'est normal car c'est super mal foutu.

      Le premier argument, c'est pas une URL/URI ou tout autre nom de fichier, c'est juste un identifiant quelconque "unique".

      On utilise souvent des trucs ressemblant à des URL pour le côté "hiérarchique" d'identifiant unique.

      Le second paramètre, c'est une URI (c'est même très bizarre que la méthode accepte une string et pas une Uri) qui permet au validateur de récupérer le fichier .xsd qui servira à la validation des éléments XML.

      Si votre second paramètre est une chaine simple, il est fort à parier que le validateur cherchera le fichier dans le système de fichier local, ce qui peut être très gênant sous Android.

      Le débogueur vous donnera ces informations de manière univoque.

      https://docs.microsoft.com/fr-fr/dotnet/api/system.xml.schema.xmlschemaset.add?view=netframework-4.8#System_Xml_Schema_XmlSchemaSet_Add_System_String_System_String_

      • Partager sur Facebook
      • Partager sur Twitter
      Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
        24 septembre 2019 à 11:00:11

        Merci pour la réponse mais malheureusement : 

        • le débogueur ne m'aide absolument pas dans cette situation. Il n'affiche rien
        • je ne comprends pas ce que vous dites à propos de la différence string / URI
        • j'avais déjà consulté la documentation microsoft avant de poser ma question et celle-ci ne m'avait pas aidé à résoudre mon problème

        J'ai donc toujours la question suivante : comment savoir quel URI renseigner ? Je l'invente ou bien je peux le sortir de quelque part ?

        En espérant que quelqu'un puisse me donner une réponse claire :D

        • Partager sur Facebook
        • Partager sur Twitter
          24 septembre 2019 à 12:06:10

          >Il n'affiche rien

          C'est pas son rôle, il est là pour déboguer, pas pour logguer.

          Il faut que vous utilisez les outils pour voir les variables, callstack, etc...

          >la différence string / URI

          https://docs.microsoft.com/fr-fr/dotnet/api/system.uri?view=netframework-4.8

          https://docs.microsoft.com/fr-fr/dotnet/api/system.string?view=netframework-4.8

          Vous verrez que ces 2 classes ne sont pas identiques.

          >j'avais déjà consulté la documentation microsoft avant de poser

          Si vous ne faites pas la différence entre une URI et une string, vous n'avez pas vraiment les outils pour la comprendre alors.

          > Je l'invente ou bien je peux le sortir de quelque part ?

          Bin non, vous la créez correctement pour que la bibliothèque de validation du Xml sous en capacité de récupérer le fichier XSD qui va bien.

          • Partager sur Facebook
          • Partager sur Twitter
          Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
            26 septembre 2019 à 16:20:39

            Et c'est justement là ma question : comment est-ce que je créé correctement l'URI ?
            • Partager sur Facebook
            • Partager sur Twitter
              26 septembre 2019 à 17:32:30

              Bin, comme toute classe, en appelant un de ces constructeurs.

              https://docs.microsoft.com/fr-fr/dotnet/api/system.uri.-ctor?view=netframework-4.8

              En particulier :

              https://docs.microsoft.com/fr-fr/dotnet/api/system.uri.-ctor?view=netframework-4.8#System_Uri__ctor_System_String_System_UriKind_

              Et je vous conseille de réviser ce qu'est une URI

              https://fr.wikipedia.org/wiki/Uniform_Resource_Identifier

              En particulier, la séparation entre URL et URN ainsi que comment est formé CORRECTEMENT une URL.

              • Partager sur Facebook
              • Partager sur Twitter
              Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.

              Accès à mon schéma XSD

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown