Forum Programmation.c++ parseur sax xml

Posté par  .
Étiquettes : aucune
0
13
avr.
2005
bonjour,
j ai un peu de difficulté a comprendre comment ca marche un parseur. particulierement SAX. j'aimerai bien lire un fichier xml et extraire les données dont j ai besoin.
ce que j aimerais savoir c'est comment fait-on pour passer d'un element a un autre?

j'ai trouvé le bout de code suivant sur le net, mais je sais pas comment faire pour tous les elements d'un fichier xml(ce code arrete le parseur dés qu'il trouve le premier element recherché)


ISAXXMLReaderPtr pSAXReader = NULL;
HRESULT hr;
hr = pSAXReader.CreateInstance(__uuidof(SAXXMLReader30));
ContentHandlerImpl* pCH = new ContentHandlerImpl();

if(!FAILED(hr))
{
_tcscpy(pCH->m_szElemToMatch, m_strElementName);

hr = pSAXReader->putContentHandler(pCH);


// Initialize the IMXReaderControlPtr member variable
// in the ContentHandler Implementation to allow aborting the parsing
pCH->m_readerControl = pSAXReader;
pSAXReader.AddRef();

wchar_t wcURL[MAX_PATH]={0};
mbstowcs( wcURL, m_strXMLFileName, _tcslen(m_strXMLFileName) );

hr = pSAXReader->parseURL(wcURL);

}

if(!FAILED(hr))
{
for (int i=0;i<5;i++)
{
if(pCH->m_bElementFound == TRUE)
{
m_strResultText = _T("\n\n Element found! \n\n");
m_strResultText += pCH->m_strElemContent;
}
else
{
m_strResultText = _T("Element NOT found!");
}
}
}
else
{
m_strResultText.Format(_T("Error %08X"), hr);
}



merci d'avance.
  • # Définition d'un Contenthandler

    Posté par  (site web personnel) . Évalué à 2.

    Salut
    L'idée c'est de définir un Handler qui va intercepter tous les évènements SAX avec les méthodes suivantes:

    // Un bon endroit pour initialiser ta structure de donnée
    public void startDocument ()

    // Invoqué par ton parseur à la fin de l'analyse du document.
    public void endDocument ()

    // Dans cette méthode tu as le nom de l'élément qui vient de
    // démarrer et ses attributs mais pas à ce qu'il contient
    public void startElement (String uri, String localName, String qName, Attributes attributes)
    public void endElement (String uri, String localName, String qName)

    // C'est ici que tu peux récupérer les caractères
    // entre deux éléments.
    // Comme le nom de l'élément parent n'est pas dispo
    // il faut que tu aies un attribut de classe qui te permette de
    // savoir quel est l'élément courant.
    public void characters (char ch[], int start, int length)



    Ce n'est pas la liste exhaustive des méthodes d'un sax handler (gestion des erreurs, des caractères blancs...) mais ce sont les principales.
    Donc dans ton cas tu dois créer une classe qui implémente ContentHandler et l'utiliser à la place de ton ContentHandlerImpl

    Le parsing SAX est indiquée en général pour le traitement des gros fichiers XML (On n'a pas tout l'arbre XML en mémoire) ou lorsque les performances sont importantes (contrôle des éléments à ignorer...).

    Si c'est pour un fichier de configuration ce sera plus intuitif de le coder en DOM (tu as un arbre XML en mémoire et tu te ballades dedans sans te soucier de la séquence des éléments).
    • [^] # Re: Définition d'un Contenthandler

      Posté par  . Évalué à 1.

      merci pour ta reponse. ca m a beaucoup aidé.
      j ai implanté une nouvelle classe MyContent qui implémente le contenthandler. or, je sais pas comment redefinir la fonction Startelement(),ni ou et quand devrais je l appeller?
      • [^] # Re: Définition d'un Contenthandler

        Posté par  . Évalué à 1.

        bonjour,
        j'ai pu enfin comprendre le principe du parsing (ca m a pris du temps :)) merci pour votre precieuse aide. j'ai terminé ma classe et j ai redefini mes fonctions et je suis desormais en mesure d'avoir les informations et les stocker dans un fichier texte.

        bien a vous.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.