Bonjour à tous,
j'ai comme devoir de réaliser un interpréteur XML mais je n'ai
aucune idée comment m'y prendre.... je vous résume un peu le
problème...
[...]
Je vous demande votre aide car je n'y comprend absolument
rien....
Alors que les meilleurs se mettent à leur clavier pour me venir
en aide!!!
Bonjour à tous,
j'ai comme devoir de réaliser un interpréteur XML mais je n'ai
aucune idée comment m'y prendre.... je vous résume un peu le
problème...
[...]
Je vous demande votre aide car je n'y comprend absolument
rien....
Alors que les meilleurs se mettent à leur clavier pour me venir
en aide!!!
Bonjour à tous,
j'ai comme devoir de réaliser un interpréteur XML mais je n'ai
aucune idée comment m'y prendre.... je vous résume un peu le
problème...
[...]
Je vous demande votre aide car je n'y comprend absolument
rien....
Alors que les meilleurs se mettent à leur clavier pour me venir
en aide!!!
Bonjour à tous,
Ont doit lire le fichier XML en entré et générer un rapport en sortie.
On doit utiliser la récursivité et la POO pour gérer le fichier en
mémoire.
Le fichier en sortie doit etre sous le format suivant:
<A>
<B id="test">
<C>texte de C</C>
<D type="alpha"/>
<B/>
<A/>
Ont doit fournir le rapport suivant:
Le noeud <A> contient
Le noeud <B> contient
L'attribut « id » qui a la valeur «test»
Le noeud <C> contient
Le texte «texte de C»
Le noeud <D> contient
L'attribut «type» qui a la valeur «alpha»
Je vous demande votre aide car je n'y comprend absolument rien....
ca depend evidemment de ton nivau, mais un parser xml n'est au final pas
Alors que les meilleurs se mettent à leur clavier pour me venir en
aide!!!
faut pas esperer recuperer les sources de ton projet ici ;-)
Bonjour à tous,
Ont doit lire le fichier XML en entré et générer un rapport en sortie.
On doit utiliser la récursivité et la POO pour gérer le fichier en
mémoire.
Le fichier en sortie doit etre sous le format suivant:
<A>
<B id="test">
<C>texte de C</C>
<D type="alpha"/>
<B/>
<A/>
Ont doit fournir le rapport suivant:
Le noeud <A> contient
Le noeud <B> contient
L'attribut « id » qui a la valeur «test»
Le noeud <C> contient
Le texte «texte de C»
Le noeud <D> contient
L'attribut «type» qui a la valeur «alpha»
Je vous demande votre aide car je n'y comprend absolument rien....
ca depend evidemment de ton nivau, mais un parser xml n'est au final pas
Alors que les meilleurs se mettent à leur clavier pour me venir en
aide!!!
faut pas esperer recuperer les sources de ton projet ici ;-)
Bonjour à tous,
Ont doit lire le fichier XML en entré et générer un rapport en sortie.
On doit utiliser la récursivité et la POO pour gérer le fichier en
mémoire.
Le fichier en sortie doit etre sous le format suivant:
<A>
<B id="test">
<C>texte de C</C>
<D type="alpha"/>
<B/>
<A/>
Ont doit fournir le rapport suivant:
Le noeud <A> contient
Le noeud <B> contient
L'attribut « id » qui a la valeur «test»
Le noeud <C> contient
Le texte «texte de C»
Le noeud <D> contient
L'attribut «type» qui a la valeur «alpha»
Je vous demande votre aide car je n'y comprend absolument rien....
ca depend evidemment de ton nivau, mais un parser xml n'est au final pas
Alors que les meilleurs se mettent à leur clavier pour me venir en
aide!!!
faut pas esperer recuperer les sources de ton projet ici ;-)
Country wrote:Ont doit lire le fichier XML en entré et générer un rapport en
sortie. On doit utiliser la récursivité et la POO pour gérer le
fichier en mémoire.
Le fichier en sortie doit etre sous le format suivant:
<A>
<B id="test">
<C>texte de C</C>
<D type="alpha"/>
<B/>
<A/>
Ont doit fournir le rapport suivant:
Le noeud <A> contient
Le noeud <B> contient
L'attribut « id » qui a la valeur «test»
Le noeud <C> contient
Le texte «texte de C»
Le noeud <D> contient
L'attribut «type» qui a la valeur «alpha»
Je vous demande votre aide car je n'y comprend absolument rien....
ca depend evidemment de ton nivau, mais un parser xml n'est au final
pas tres difficile a implementer.
les etapes classiques sont :
- faire un lexer qui s'occupe de decouper en token ton fichier
d'entree(google)
- parser en se servant des tokens (pour le xml comme la syntaxe est
simple, le lexer n'est pas necessaire mais je te conseille qd meme
d'en utiliser un)
pour la recursivité, ca saute au yeux enfin pour moi. un tag contiend
d'autre tag.
si tu as une classe Tag avec une methode parse tu auras forcement un
truc du style :
Tag::parse(...){
...
subTag->parse....
...
}
d'une maniere generale c la stucture d'arbre derriere le xml qui
implique ca.
utiliser la POO s'y prete bien, une classe Tag, une Attrib un attribut
contiend un nom et une valeur par exemple.
pour le rapport de sortie, tu verras que lorsque tu auras parse ton
fichier et eu ton xml en memoire, cette partie ne devrait pas depasser
6 lignes de codeAlors que les meilleurs se mettent à leur clavier pour me venir en
aide!!!
faut pas esperer recuperer les sources de ton projet ici ;-)
Je tente juste de te donner des piste pour commencer (j'en ai pas trop
dit, hein?).
Country wrote:
Ont doit lire le fichier XML en entré et générer un rapport en
sortie. On doit utiliser la récursivité et la POO pour gérer le
fichier en mémoire.
Le fichier en sortie doit etre sous le format suivant:
<A>
<B id="test">
<C>texte de C</C>
<D type="alpha"/>
<B/>
<A/>
Ont doit fournir le rapport suivant:
Le noeud <A> contient
Le noeud <B> contient
L'attribut « id » qui a la valeur «test»
Le noeud <C> contient
Le texte «texte de C»
Le noeud <D> contient
L'attribut «type» qui a la valeur «alpha»
Je vous demande votre aide car je n'y comprend absolument rien....
ca depend evidemment de ton nivau, mais un parser xml n'est au final
pas tres difficile a implementer.
les etapes classiques sont :
- faire un lexer qui s'occupe de decouper en token ton fichier
d'entree(google)
- parser en se servant des tokens (pour le xml comme la syntaxe est
simple, le lexer n'est pas necessaire mais je te conseille qd meme
d'en utiliser un)
pour la recursivité, ca saute au yeux enfin pour moi. un tag contiend
d'autre tag.
si tu as une classe Tag avec une methode parse tu auras forcement un
truc du style :
Tag::parse(...){
...
subTag->parse....
...
}
d'une maniere generale c la stucture d'arbre derriere le xml qui
implique ca.
utiliser la POO s'y prete bien, une classe Tag, une Attrib un attribut
contiend un nom et une valeur par exemple.
pour le rapport de sortie, tu verras que lorsque tu auras parse ton
fichier et eu ton xml en memoire, cette partie ne devrait pas depasser
6 lignes de code
Alors que les meilleurs se mettent à leur clavier pour me venir en
aide!!!
faut pas esperer recuperer les sources de ton projet ici ;-)
Je tente juste de te donner des piste pour commencer (j'en ai pas trop
dit, hein?).
Country wrote:Ont doit lire le fichier XML en entré et générer un rapport en
sortie. On doit utiliser la récursivité et la POO pour gérer le
fichier en mémoire.
Le fichier en sortie doit etre sous le format suivant:
<A>
<B id="test">
<C>texte de C</C>
<D type="alpha"/>
<B/>
<A/>
Ont doit fournir le rapport suivant:
Le noeud <A> contient
Le noeud <B> contient
L'attribut « id » qui a la valeur «test»
Le noeud <C> contient
Le texte «texte de C»
Le noeud <D> contient
L'attribut «type» qui a la valeur «alpha»
Je vous demande votre aide car je n'y comprend absolument rien....
ca depend evidemment de ton nivau, mais un parser xml n'est au final
pas tres difficile a implementer.
les etapes classiques sont :
- faire un lexer qui s'occupe de decouper en token ton fichier
d'entree(google)
- parser en se servant des tokens (pour le xml comme la syntaxe est
simple, le lexer n'est pas necessaire mais je te conseille qd meme
d'en utiliser un)
pour la recursivité, ca saute au yeux enfin pour moi. un tag contiend
d'autre tag.
si tu as une classe Tag avec une methode parse tu auras forcement un
truc du style :
Tag::parse(...){
...
subTag->parse....
...
}
d'une maniere generale c la stucture d'arbre derriere le xml qui
implique ca.
utiliser la POO s'y prete bien, une classe Tag, une Attrib un attribut
contiend un nom et une valeur par exemple.
pour le rapport de sortie, tu verras que lorsque tu auras parse ton
fichier et eu ton xml en memoire, cette partie ne devrait pas depasser
6 lignes de codeAlors que les meilleurs se mettent à leur clavier pour me venir en
aide!!!
faut pas esperer recuperer les sources de ton projet ici ;-)
Je tente juste de te donner des piste pour commencer (j'en ai pas trop
dit, hein?).
C'est même normalisé, voir
http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/. Pour ce qu'il a à
faire, Node, Element, Attribute et Text doivent suffir. (Node, c'est la
classe de base des autres.) Les fonctions clé pour une implémentation
C++ seraient childNodes() et attributes(). (L'interface standard est
conçue pour supporter le chaînage invasif,
mais je crois que pour une implémentation primitive en C++, je me contenterai d'un std::list
renvoyé de childNodes(), et je laisserais tomber les fonctions sur les
siblings.)
C'est même normalisé, voir
http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/. Pour ce qu'il a à
faire, Node, Element, Attribute et Text doivent suffir. (Node, c'est la
classe de base des autres.) Les fonctions clé pour une implémentation
C++ seraient childNodes() et attributes(). (L'interface standard est
conçue pour supporter le chaînage invasif,
mais je crois que pour une implémentation primitive en C++, je me contenterai d'un std::list
renvoyé de childNodes(), et je laisserais tomber les fonctions sur les
siblings.)
C'est même normalisé, voir
http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/. Pour ce qu'il a à
faire, Node, Element, Attribute et Text doivent suffir. (Node, c'est la
classe de base des autres.) Les fonctions clé pour une implémentation
C++ seraient childNodes() et attributes(). (L'interface standard est
conçue pour supporter le chaînage invasif,
mais je crois que pour une implémentation primitive en C++, je me contenterai d'un std::list
renvoyé de childNodes(), et je laisserais tomber les fonctions sur les
siblings.)
C'est même normalisé, voir
http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/. Pour ce qu'il a
à faire, Node, Element, Attribute et Text doivent suffir. (Node,
c'est la classe de base des autres.) Les fonctions clé pour une
implémentation C++ seraient childNodes() et attributes().
(L'interface standard est conçue pour supporter le chaînage invasif,
chainage invasif, qu'est-ce donc?
mais je crois que pour une implémentation primitive en C++, je me
contenterai d'un std::list renvoyé de childNodes(), et je laisserais
tomber les fonctions sur les siblings.)
moi j'utilise un std::multimap avec en clef le nom du sous tag et ca
se passe plutot bien ;-)
C'est même normalisé, voir
http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/. Pour ce qu'il a
à faire, Node, Element, Attribute et Text doivent suffir. (Node,
c'est la classe de base des autres.) Les fonctions clé pour une
implémentation C++ seraient childNodes() et attributes().
(L'interface standard est conçue pour supporter le chaînage invasif,
chainage invasif, qu'est-ce donc?
mais je crois que pour une implémentation primitive en C++, je me
contenterai d'un std::list renvoyé de childNodes(), et je laisserais
tomber les fonctions sur les siblings.)
moi j'utilise un std::multimap avec en clef le nom du sous tag et ca
se passe plutot bien ;-)
C'est même normalisé, voir
http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/. Pour ce qu'il a
à faire, Node, Element, Attribute et Text doivent suffir. (Node,
c'est la classe de base des autres.) Les fonctions clé pour une
implémentation C++ seraient childNodes() et attributes().
(L'interface standard est conçue pour supporter le chaînage invasif,
chainage invasif, qu'est-ce donc?
mais je crois que pour une implémentation primitive en C++, je me
contenterai d'un std::list renvoyé de childNodes(), et je laisserais
tomber les fonctions sur les siblings.)
moi j'utilise un std::multimap avec en clef le nom du sous tag et ca
se passe plutot bien ;-)
Ça sert souvent avec les objets d'entité, qui ne supporte pas la
copie, et qui se trouve dans exactement une chaîne à la fois. Une
chaînage double invasif a l'avantage que l'objet peut s'ôter de la
chaîne dans son destructeur, sans savoir dans quelle chaîne il est.
Ça sert souvent avec les objets d'entité, qui ne supporte pas la
copie, et qui se trouve dans exactement une chaîne à la fois. Une
chaînage double invasif a l'avantage que l'objet peut s'ôter de la
chaîne dans son destructeur, sans savoir dans quelle chaîne il est.
Ça sert souvent avec les objets d'entité, qui ne supporte pas la
copie, et qui se trouve dans exactement une chaîne à la fois. Une
chaînage double invasif a l'avantage que l'objet peut s'ôter de la
chaîne dans son destructeur, sans savoir dans quelle chaîne il est.
Et comment fais-tu quand les sous-tag comportent des éléments avec le
même sous-tag ?
En général, la structure est récursive. J'aurais une tendance à
implémenter au moins Node::getAttributes() et Node::getChildNodes() (et
probablement Node::getParent()) de l'interface standard. Mais rien
n'empèche d'avoir des map à côté, afin de pouvoir rétrouver certains
éléments plus rapidement. Et j'avoue que pour beaucoup d'applications,
les types de vertice Attribute, Element et Text suffirait largement.
Et comment fais-tu quand les sous-tag comportent des éléments avec le
même sous-tag ?
En général, la structure est récursive. J'aurais une tendance à
implémenter au moins Node::getAttributes() et Node::getChildNodes() (et
probablement Node::getParent()) de l'interface standard. Mais rien
n'empèche d'avoir des map à côté, afin de pouvoir rétrouver certains
éléments plus rapidement. Et j'avoue que pour beaucoup d'applications,
les types de vertice Attribute, Element et Text suffirait largement.
Et comment fais-tu quand les sous-tag comportent des éléments avec le
même sous-tag ?
En général, la structure est récursive. J'aurais une tendance à
implémenter au moins Node::getAttributes() et Node::getChildNodes() (et
probablement Node::getParent()) de l'interface standard. Mais rien
n'empèche d'avoir des map à côté, afin de pouvoir rétrouver certains
éléments plus rapidement. Et j'avoue que pour beaucoup d'applications,
les types de vertice Attribute, Element et Text suffirait largement.
writes:Ça sert souvent avec les objets d'entité, qui ne supporte pas la
copie, et qui se trouve dans exactement une chaîne à la fois. Une
chaînage double invasif a l'avantage que l'objet peut s'ôter de la
chaîne dans son destructeur, sans savoir dans quelle chaîne il est.
Comment peux-tu programmer le destructeur si tu ne connais pas la
chaine ?
Avec le lien vers l'arriere qui est un pointeur vers pointeur ? Mais
alors je ne vois pas comment implementer le getPreviousSibling() dont
tu parles apres (un cast va foirer si on applique getPreviousSibling
au premier de la liste).
kanze@gabi-soft.fr writes:
Ça sert souvent avec les objets d'entité, qui ne supporte pas la
copie, et qui se trouve dans exactement une chaîne à la fois. Une
chaînage double invasif a l'avantage que l'objet peut s'ôter de la
chaîne dans son destructeur, sans savoir dans quelle chaîne il est.
Comment peux-tu programmer le destructeur si tu ne connais pas la
chaine ?
Avec le lien vers l'arriere qui est un pointeur vers pointeur ? Mais
alors je ne vois pas comment implementer le getPreviousSibling() dont
tu parles apres (un cast va foirer si on applique getPreviousSibling
au premier de la liste).
writes:Ça sert souvent avec les objets d'entité, qui ne supporte pas la
copie, et qui se trouve dans exactement une chaîne à la fois. Une
chaînage double invasif a l'avantage que l'objet peut s'ôter de la
chaîne dans son destructeur, sans savoir dans quelle chaîne il est.
Comment peux-tu programmer le destructeur si tu ne connais pas la
chaine ?
Avec le lien vers l'arriere qui est un pointeur vers pointeur ? Mais
alors je ne vois pas comment implementer le getPreviousSibling() dont
tu parles apres (un cast va foirer si on applique getPreviousSibling
au premier de la liste).
wrote:Et comment fais-tu quand les sous-tag comportent des éléments avec
le même sous-tag ?
En général, la structure est récursive. J'aurais une tendance à
implémenter au moins Node::getAttributes() et Node::getChildNodes()
(et probablement Node::getParent()) de l'interface standard. Mais
rien n'empèche d'avoir des map à côté, afin de pouvoir rétrouver
certains éléments plus rapidement. Et j'avoue que pour beaucoup
d'applications, les types de vertice Attribute, Element et Text
suffirait largement.
voila ce que ca donne en version light
ca se prete assez bien a la manipulation
comme recuperer les sous tags portant un certain nom, etc
struct Attrib{
pair<string, string> _value;
};
struct Tag{
string _name;
multimap<string, Tag*> _children;
map<string, Attrib*> _attributes
};
c bien entendu une structure recursive, donc l'un dans l'autre, je
pense qu'on parle de la meme chose ;-)
kanze@gabi-soft.fr wrote:
Et comment fais-tu quand les sous-tag comportent des éléments avec
le même sous-tag ?
En général, la structure est récursive. J'aurais une tendance à
implémenter au moins Node::getAttributes() et Node::getChildNodes()
(et probablement Node::getParent()) de l'interface standard. Mais
rien n'empèche d'avoir des map à côté, afin de pouvoir rétrouver
certains éléments plus rapidement. Et j'avoue que pour beaucoup
d'applications, les types de vertice Attribute, Element et Text
suffirait largement.
voila ce que ca donne en version light
ca se prete assez bien a la manipulation
comme recuperer les sous tags portant un certain nom, etc
struct Attrib{
pair<string, string> _value;
};
struct Tag{
string _name;
multimap<string, Tag*> _children;
map<string, Attrib*> _attributes
};
c bien entendu une structure recursive, donc l'un dans l'autre, je
pense qu'on parle de la meme chose ;-)
wrote:Et comment fais-tu quand les sous-tag comportent des éléments avec
le même sous-tag ?
En général, la structure est récursive. J'aurais une tendance à
implémenter au moins Node::getAttributes() et Node::getChildNodes()
(et probablement Node::getParent()) de l'interface standard. Mais
rien n'empèche d'avoir des map à côté, afin de pouvoir rétrouver
certains éléments plus rapidement. Et j'avoue que pour beaucoup
d'applications, les types de vertice Attribute, Element et Text
suffirait largement.
voila ce que ca donne en version light
ca se prete assez bien a la manipulation
comme recuperer les sous tags portant un certain nom, etc
struct Attrib{
pair<string, string> _value;
};
struct Tag{
string _name;
multimap<string, Tag*> _children;
map<string, Attrib*> _attributes
};
c bien entendu une structure recursive, donc l'un dans l'autre, je
pense qu'on parle de la meme chose ;-)
Jean-Marc Bourguet wrote in message
news:...Comment peux-tu programmer le destructeur si tu ne connais pas la
chaine ?
[Mixin, Liste circulaire, dynamic_cast]
Jean-Marc Bourguet <jm@bourguet.org> wrote in message
news:<pxbd606etml.fsf@news.bourguet.org>...
Comment peux-tu programmer le destructeur si tu ne connais pas la
chaine ?
[Mixin, Liste circulaire, dynamic_cast]
Jean-Marc Bourguet wrote in message
news:...Comment peux-tu programmer le destructeur si tu ne connais pas la
chaine ?
[Mixin, Liste circulaire, dynamic_cast]