IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Lecture fichier Xml avec SelectNode et schema XSD


Sujet :

C#

  1. #1
    Membre éclairé
    Inscrit en
    Mai 2003
    Messages
    271
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2003
    Messages : 271
    Points : 720
    Points
    720
    Par défaut Lecture fichier Xml avec SelectNode et schema XSD
    J ai un problème avec les ajouts de namespace qui concernent les schemas. Je ne parviens pas à utiliser les methods SelectNode à cause de ces déclarations.
    J'ai certes trouvé un sujet similaire ici mais qui ne résoud pas mon pb.

    Voici mon fichier xml:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    <?xml version="1.0" encoding="UTF-8"?>
    <AUTOSAR xmlns="http://autosar.org" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://autosar.org autosar.xsd">
       <TOP-LEVEL-PACKAGES>
            <AR-PACKAGE>
         	  <SHORT-NAME>AUTOSAR</SHORT-NAME>
    	  <SUB-PACKAGES>
    	          <AR-PACKAGE>
    		   <SHORT-NAME>Units</SHORT-NAME>
    		   <ELEMENTS>
    			    <UNIT>
    			        <SHORT-NAME>percent</SHORT-NAME>
    			        <DISPLAY-NAME>%</DISPLAY-NAME>
    			    </UNIT>
    		   </ELEMENTS>
    	          </AR-PACKAGE>
    	   </SUB-PACKAGES>
           </AR-PACKAGE>
        </TOP-LEVEL-PACKAGES>
    </AUTOSAR>
    Et mon code src:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    this.xmlDoc = new XmlDocument();
    this.xmlDoc.Load(xmlFilePath);
    if (xmlDoc.DocumentElement.Name != "AUTOSAR")
         throw new ArgumentException(xmlFilePath + " does not describe a proper AUTOSAR XML document.");
    //Create an XmlNamespaceManager for resolving namespaces.
    this.nsmgr = new XmlNamespaceManager(xmlDoc.NameTable);
    this.nsmgr.AddNamespace(String.Empty, "http://autosar.org");            
    this.nsmgr.AddNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance");
    this.nsmgr.AddNamespace("xsi:schemaLocation", "http://autosar.org autosar.xsd"); 
    const string xpath = "/AUTOSAR/TOP-LEVEL-PACKAGES/AR-PACKAGE/SUB-PACKAGES/AR-PACKAGE";
    XmlNodeList nodeList = xmlDoc.SelectNodes(xpath, nsmgr);
    int count = nodeList.Count;
    En supprimant la déclaration des namespaces ds le fichier xml, mon code trouve bien un node. Mais avec, cela ne fonctionne tjs pas. Qqch doit manquer ds les AddNamespace, je ne vois pas quoi.

    Une idée?

  2. #2
    maa
    maa est déconnecté
    Membre actif
    Avatar de maa
    Inscrit en
    Octobre 2005
    Messages
    672
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Octobre 2005
    Messages : 672
    Points : 288
    Points
    288
    Par défaut
    A priori, il faut forcément ajouter un préfix à ton namespace par défaut si tu souhaite utiliser des expressions xPath.

    Il faut donc écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nsmgr.AddNamespace("x", "http://autosar.org");
    puis

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const string xpath = "/x:AUTOSAR/x:TOP-LEVEL-PACKAGES/x:AR-PACKAGE/x:SUB-PACKAGES/x:AR-PACKAGE";
    Là ça marche.
    ****************************************

    - I don’t write plumbing code anymore
    - I use PostSharp
    - And you?


    ****************************************

  3. #3
    Membre éclairé
    Inscrit en
    Mai 2003
    Messages
    271
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2003
    Messages : 271
    Points : 720
    Points
    720
    Par défaut
    Merci pour ta réponse.
    Les SelectNodes fonctionne bien avec ta suggestion
    Mais c'est bien lourd à l'utilisation. Partout où j'ai des xpath qui font des longeurs, je dois ajouter un x: -> chute de la lisibilité

    Du coup, j'ai écrit les méthodes suivantes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
            private XmlNode SelectSingleNode(XmlNode parentNode, string xpath)
            {
                return parentNode.SelectSingleNode(ComputeXpath(xpath), nsmgr);
            }
     
            private XmlNodeList SelectNodes(XmlNode parentNode, string xpath)
            {
                return parentNode.SelectNodes(ComputeXpath(xpath), nsmgr);
            }
     
            private string ComputeXpath(string xpath)
            {
                string[] elements = xpath.Split('/');
                string nsXPath = "";
                for (int i = 0; i < elements.Length; i++)
                {
                    nsXPath += "x:" + elements[i] + "/";
                }
                return nsXPath.Substring(0, nsXPath.Length - 1);
            }
    Ainsi, je peux utiliser qqch comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    XmlNodeList numeratorNodes = SelectNodes(dataTypeNode, "COMPU-PHYS-TO-INTERNAL/COMPU-SCALES/COMPU-SCALE/COMPU-RATIONAL-COEFFS/COMPU-NUMERATOR/V");

  4. #4
    maa
    maa est déconnecté
    Membre actif
    Avatar de maa
    Inscrit en
    Octobre 2005
    Messages
    672
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Octobre 2005
    Messages : 672
    Points : 288
    Points
    288
    Par défaut
    Tu vas juste avoir un soucis pour ce genre d'expression xPath :
    /../unNoeud
    /./unNoeud
    //unNoeud
    /*/unNoeud
    child::unNoeud
    ...

    Je te conseilles donc d'utiliser plutôt les expressions régulières. De plus, ça sera plus performant.
    ****************************************

    - I don’t write plumbing code anymore
    - I use PostSharp
    - And you?


    ****************************************

  5. #5
    Membre éclairé
    Inscrit en
    Mai 2003
    Messages
    271
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2003
    Messages : 271
    Points : 720
    Points
    720
    Par défaut
    oui, je sais, j ai fait ca juste vite fait pour les cas simples de xpath comme donné en example.

    Quant aux performances des regex,
    http://www.developpez.net/forums/sho...d.php?t=285643 ...

    Du coup, j ai arrangé un peu mon code, et puis aussi en validant mon xml par rapport au XSD tant que j'y suis...

  6. #6
    maa
    maa est déconnecté
    Membre actif
    Avatar de maa
    Inscrit en
    Octobre 2005
    Messages
    672
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Octobre 2005
    Messages : 672
    Points : 288
    Points
    288
    Par défaut
    Je viens de faire un test, c'est 2 à 3 fois plus rapide avec une Regex (tu ne créé pas de collection). Mais bon à ce niveau là, je t'accorde que ça ne change pas grand chose...
    Par contre, comme je le disais, les expressions régulière te permettrons de gérer tous les cas qui peuvent se présenter dans Xpath.
    ****************************************

    - I don’t write plumbing code anymore
    - I use PostSharp
    - And you?


    ****************************************

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [11gR2] Lecture fichier XML avec XMLDOM
    Par jeremzzz dans le forum PL/SQL
    Réponses: 4
    Dernier message: 12/06/2015, 10h39
  2. Lecture fichier XML avec Eclipse
    Par faloulau dans le forum Eclipse
    Réponses: 3
    Dernier message: 22/03/2011, 16h23
  3. [PHP 4] Lecture fichier XML avec PHP
    Par Oncle_Pete dans le forum Langage
    Réponses: 3
    Dernier message: 28/01/2009, 17h17
  4. [DOM] lecture fichier XML avec DOM
    Par roosse dans le forum Format d'échange (XML, JSON...)
    Réponses: 8
    Dernier message: 09/04/2008, 12h39
  5. Valider un fichier XML avec un Schema
    Par Groove dans le forum Valider
    Réponses: 4
    Dernier message: 09/11/2005, 08h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo