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 avanc�e dans un fichier XML volumineux C#


Sujet :

C#

  1. #1
    Membre confirm�
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Octobre 2015
    Messages
    98
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 45
    Localisation : France, Essonne (�le de France)

    Informations professionnelles :
    Activit� : Enseignant Chercheur
    Secteur : Sant�

    Informations forums :
    Inscription : Octobre 2015
    Messages : 98
    Par d�faut Lecture avanc�e dans un fichier XML volumineux C#
    Bonjour,

    J'ai r�cup�r� un fichier XML open source tr�s volumineux (>30 Mo)

    -Ce fichier va �voluer (re DL r�guli�rement fonction des mises � jour) donc je ne peut pas faire de conversion en un autre format .
    -Je ne fait dessus que de la lecture (pas d'�criture).
    -Je souhaite un acc�s rapide par flux sans chargement du fichier XML dans son entier (ou peut �tre une bonne fois pour toute au d�marrage mais sans bouffer la m�moire).

    Que me conseillez-vous comme approche?

    XmlTextreader -> conseil de l'abandonn�e au profit de XMLReader
    Xml to Linq -> sympas pour les requ�tes mais n�cessite de charger la base en entier au pr�alable (enfin je crois)
    XElement -> idem (enfin je crois)
    Xpath via XmlNodeList pas mal mais j'en chie pour faire mes requ�tes...


    le DTD est de cette forme
    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
    21
    22
    23
    24
    25
    26
    27
     
    <!ELEMENT WN (SYNSET+)>
    <!ELEMENT sl.dbxml (SYNSET+)>
    <!ELEMENT SYNSET (STAMP?, ILR*, SUMO*, G_SYN?, ID, SYNONYM, DEF, USAGE*, SNOTE?, BCS?, DOMAIN?, NL*, POS)>
    <!--ELEMENT SYNSET (ID | POS | SYNONYM | ILR | DEF | USAGE | SNOTE | BCS | DOMAIN | NL | SUMO | G_SYN | STAMP)+ -->
    <!ELEMENT ID (#PCDATA)>
    <!ELEMENT POS (#PCDATA)>
    <!ELEMENT SYNONYM (LITERAL | WORD)+>
    <!ELEMENT LITERAL (#PCDATA)>
    <!ATTLIST LITERAL
              lnote CDATA #IMPLIED
              sense CDATA #IMPLIED>
    <!ELEMENT WORD (#PCDATA)>
    <!ELEMENT ILR (#PCDATA)>
    <!ATTLIST ILR
              type CDATA #REQUIRED>
    <!ELEMENT DEF (#PCDATA)>
    <!ELEMENT USAGE (#PCDATA)>
    <!ELEMENT SNOTE (#PCDATA)>
    <!ELEMENT BCS (#PCDATA)>
    <!ELEMENT DOMAIN (#PCDATA)>
    <!ELEMENT NL (#PCDATA)>
    <!ELEMENT SUMO (#PCDATA)>
    <!ATTLIST SUMO
              type CDATA #REQUIRED>
    <!ELEMENT G_SYN (#PCDATA)>
    <!ELEMENT STAMP (#PCDATA)>
    je souhaite des requ�tes type :
    -chercher dans le fichier XML, uniquement dans les n�uds LITERAL la valeur "blabla". (la c'est facile)
    -a partir de cette valeur remonte pour atteindre le n�ud le plus haut (SYNSET) et r�cup�re son ID (j'arrive a afficher tous ce qui se trouve entre les balises <SYNSET> mais je ne sais pas l'exploiter.)
    -r�cup�re tous ces ID puis trouve la valeur <POS> (la aussi �a va) plus bas dans l'arbre que LITERAL.

    Voila le type de requ�te. J'ai tester la plupart des options rapidement (j'ai du mal avec les saut de n�ud) mais je ne sais laquelle choisir.
    Merci de votre aide.

  2. #2
    Expert confirm�

    Homme Profil pro
    Responsable d�ploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 218
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 46
    Localisation : France, Seine Saint Denis (�le de France)

    Informations professionnelles :
    Activit� : Responsable d�ploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 218
    Par d�faut
    30Mo c'est tout petit �a
    Charge le en m�moire une fois pour toute.

    Je ne suis pas familier de la repr�sentation "DTD". As tu un extrait de ton xml permettant de faire des tests ?

  3. #3
    Membre Expert

    Homme Profil pro
    Responsable des �tudes
    Inscrit en
    Mars 2009
    Messages
    553
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 46
    Localisation : France, Rh�ne (Rh�ne Alpes)

    Informations professionnelles :
    Activit� : Responsable des �tudes
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2009
    Messages : 553
    Par d�faut
    Hello,

    Vu le type de recherche que tu veux faire, XPath est clairement une bonne solution.

    Tu charges, au choix, ton XML dans une instance de XPathDocument ou de XmlDocument, tu appelles la m�thode CreateNavigator() qui te retourne un objet XPathNavigator sur lequel tu peux effectuer tes requ�tes.

    Exemple (non test�), pour retrouver tous les �l�ments LITERAL dont la valeur est "blabla", remonter jusqu'au noeud parent SYNSET et obtenir l'�l�ment ID juste en dessous:

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    //LITERAL[.="blabla"]/ancestor::SYNSET/ID

  4. #4
    Membre confirm�
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Octobre 2015
    Messages
    98
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 45
    Localisation : France, Essonne (�le de France)

    Informations professionnelles :
    Activit� : Enseignant Chercheur
    Secteur : Sant�

    Informations forums :
    Inscription : Octobre 2015
    Messages : 98
    Par d�faut
    Bonsoir et merci pour votre aide.

    J'ai un peu chercher de mon coter et j'ai tester du coup la m�thode create navigator qui est assez sympas. J'ai un peu de mal avec le type de requ�te mais ma fois...

    J'ai parcouru beaucoup de (vieux?) post et en filigrane il y'a toujours la fixette de la gourmandise en ressource de tous ces mode de lecture SAUF xmlreader.

    Est-ce que quelqu'un serait me dire ce que l'on entend par la, ou un papier qui en parle? Si 37,8Mo et 117 600 lignes c'est un "petit" fichier XML je me casse clairement la t�te pour rien et comme les requ�tes Linq je suis plut�t a l'aise je partirai par la (juste question de go�t).

    Si effectivement �a consomme beaucoup j'ai pondu un mix entre requ�te xmlreader et LinQ to XML qui fonctionne bien visiblement mais je suis loin d��tre fortiche (j'ai peu �tre simplement r�inventer la roue) .
    Si vous pouvez me dire si vous trouver la d�marche coh�rente.

    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
    21
    22
    23
    24
    25
     
    XmlReaderSettings setting = new XmlReaderSettings();
                setting.DtdProcessing = DtdProcessing.Parse;
     
                string path = filename;
                using (var loulou = XmlReader.Create(path, setting))
                {
     
                    bool isOnNode = loulou.ReadToDescendant("WN");
                    while (isOnNode)
                    {
                        var element = (XElement)XNode.ReadFrom(loulou);
     
                        var bames = from nm in element.Elements("SYNSET")
                                    where (string)nm.Element("POS") == "n"
                                    select nm;
     
                        foreach (var bame in bames)
                        {
                            Console.WriteLine(bame);
                        }                    
     
                        isOnNode = loulou.ReadToNextSibling("WN");
                    }
                }
    voila encore merci

  5. #5
    Membre confirm�
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Octobre 2015
    Messages
    98
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 45
    Localisation : France, Essonne (�le de France)

    Informations professionnelles :
    Activit� : Enseignant Chercheur
    Secteur : Sant�

    Informations forums :
    Inscription : Octobre 2015
    Messages : 98
    Par d�faut
    J'ai r�solu mon soucis.
    Le mot clef �tait "streaming" ! C'est tout � fait ce que je voulait.
    Donc pour faire du Linq XML sur un flux de donn�es avec xml reader voila un bout de code bien pratique

    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
    21
    22
    23
    24
    25
    26
     
    static IEnumerable<XElement> SimpleStreamAxis(string inputUrl, string matchName)
            {
                XmlReaderSettings settings = new XmlReaderSettings();
                settings.DtdProcessing = DtdProcessing.Parse;
                using (XmlReader reader = XmlReader.Create(inputUrl, settings))
                {
                    reader.MoveToContent();
                    while (reader.Read())
                    {
                        switch (reader.NodeType)
                        {
                            case XmlNodeType.Element:
                                if (reader.Name == matchName)
                                {
                                    XElement el = XElement.ReadFrom(reader)
                                                          as XElement;
                                    if (el != null)
                                        yield return el;
                                }
                                break;
                        }
                    }
                    reader.Close();
                }
            }
    et ensuite dans une m�thode quelconque

    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
    21
    22
    23
    24
    25
    26
     
    foreach (string Mot in Mot_Clef)
                {
     
                    // Pour du Regex
                   // string pattern = @"\\b" + Mot + "\\b";                
                   //var reg = new Regex("\\b" + Mot + "\\b", RegexOptions.IgnoreCase);
     
     
     
     
                    Console.WriteLine("################## DU LINQ ##############");
     
                    string inputUrl = filename;
                    IEnumerable<string> bardQuotes = from el in SimpleStreamAxis(inputUrl, "SYNSET")
                                                     where el.Element("SYNONYM").Value.Contains(Mot)
                                                     //where reg.IsMatch(el.Element("SYNONYM").Value)  -> ligne a remplcer pour du Regex
                                                     select (string)el.Element("SYNONYM");
     
     
                    foreach (string str in bardQuotes)
                    {
                        Console.WriteLine("Identifiant : " + str.Trim());
                    }
     
                }
    J'ai laisser le code pour faire du RegEx... Il marche pour une recherche d'une chaine exact dans un string mais pas parfaitement. Je vais post sur ce sujet .

    Encore merci � vous . Ce sujet est r�solu

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. lecture de valeurs num�riques contenues dans un fichier xml
    Par yasse87 dans le forum XSL/XSLT/XPATH
    R�ponses: 2
    Dernier message: 21/04/2009, 20h13
  2. probl�me de lecture de � et � dans un fichier xml
    Par taouja dans le forum Format d'�change (XML, JSON...)
    R�ponses: 4
    Dernier message: 22/04/2007, 00h43
  3. Probl�me de lecture dans un fichier xml
    Par Pyra dans le forum Langage
    R�ponses: 2
    Dernier message: 18/12/2005, 01h13

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