OVH Cloud OVH Cloud

sax et doublons

3 réponses
Avatar
remi
Bonjour,

J'ai un problème de doublon avec l'handler ci-dessous

#---------

class MyHandler(ContentHandler):
def startDocument(self):
self._stack = []

def startElement(self, name, attr):
self._stack.append((name, attr))

def characters(self, text):
name, attr = self._stack[-1]
if name == "texte":
tag, attrssect = self._stack[-2]
print "tag : %s" %tag
print "attrssect id : %s" %str(attrssect['id'])
print "attrssect rubrik : %s" %str(attrssect['rubrik'])

def endElement(self, name):
self._stack.pop()

def _print_stack(self, msg='printing stack'):
print msg
for entry in self._stack:
name, attr = entry
infos = " : ".join(["%s = %s" % item for item in attr.items()])
print "- Parents <%s> \n: - Attributs divers : %s" % (name,
infos)



def main():
handler = MyHandler()
parser = make_parser()
parser.setContentHandler(handler)
datasource = open("/home/remi/Desktop/python/latex2xml/out.xml","r")
parser.parse(datasource)
datasource.close()

main()
#----------
Ceci me renvoie :
tag : sousSection
attrssect id : 1
attrssect rubrik : 1
tag : sousSection
attrssect id : 1
attrssect rubrik : 1
tag : sousSection
attrssect id : 2
attrssect rubrik : 1
[...]
alors que les id numérotent les sous-sections et que le doc XML est
"bien-formé" du style :
<section id="1" name="Nom" description="blabla">
<sousSection id="1" rubrik="1" thema="mon thème">
<texte>texte</texte>
</sousSection>
<sousSection id="2" rubrik="1" thema="thème 2">
<texte>texte</texte>
</sousSection>

J'ai par exemple deux fois "attrssect id" : 1, deux fois "attrssect id :
8", une fois les autres... C'est étrange.

Auriez-vous une idée ?
Merci.
Rémi.

3 réponses

Avatar
Ahmed MOHAMED ALI
Salut,
Une possibilité est que la méthode characters soit appelée plusieurs
fois.Pour que ça fonctionne, place ton code dans la méthode endElement au
lieu de le mettre dans la méthode characters.

cordialement,
Ahmed

"remi" wrote in message
news:dmrge.57873$
Bonjour,

J'ai un problème de doublon avec l'handler ci-dessous

#---------

class MyHandler(ContentHandler):
def startDocument(self):
self._stack = []

def startElement(self, name, attr):
self._stack.append((name, attr))

def characters(self, text):
name, attr = self._stack[-1]
if name == "texte":
tag, attrssect = self._stack[-2]
print "tag : %s" %tag
print "attrssect id : %s" %str(attrssect['id'])
print "attrssect rubrik : %s" %str(attrssect['rubrik'])

def endElement(self, name):
self._stack.pop()

def _print_stack(self, msg='printing stack'):
print msg
for entry in self._stack:
name, attr = entry
infos = " : ".join(["%s = %s" % item for item in
attr.items()])

print "- Parents <%s> n: - Attributs divers : %s" % (name,
infos)



def main():
handler = MyHandler()
parser = make_parser()
parser.setContentHandler(handler)
datasource = open("/home/remi/Desktop/python/latex2xml/out.xml","r")
parser.parse(datasource)
datasource.close()

main()
#----------
Ceci me renvoie :
tag : sousSection
attrssect id : 1
attrssect rubrik : 1
tag : sousSection
attrssect id : 1
attrssect rubrik : 1
tag : sousSection
attrssect id : 2
attrssect rubrik : 1
[...]
alors que les id numérotent les sous-sections et que le doc XML est
"bien-formé" du style :
<section id="1" name="Nom" description="blabla">
<sousSection id="1" rubrik="1" thema="mon thème">
<texte>texte</texte>
</sousSection>
<sousSection id="2" rubrik="1" thema="thème 2">
<texte>texte</texte>
</sousSection>

J'ai par exemple deux fois "attrssect id" : 1, deux fois "attrssect id :
8", une fois les autres... C'est étrange.

Auriez-vous une idée ?
Merci.
Rémi.


Avatar
bruno modulix
Ahmed MOHAMED ALI wrote:
(snip)

"remi" wrote in message
news:dmrge.57873$

Bonjour,

J'ai un problème de doublon avec l'handler ci-dessous

#---------

class MyHandler(ContentHandler):
def startDocument(self):
self._stack = []

def startElement(self, name, attr):
self._stack.append((name, attr))

def characters(self, text):
name, attr = self._stack[-1]
if name == "texte":
tag, attrssect = self._stack[-2]
print "tag : %s" %tag
print "attrssect id : %s" %str(attrssect['id'])
print "attrssect rubrik : %s" %str(attrssect['rubrik'])

def endElement(self, name):
self._stack.pop()

def _print_stack(self, msg='printing stack'):
print msg
for entry in self._stack:
name, attr = entry
infos = " : ".join(["%s = %s" % item for item in


attr.items()])

print "- Parents <%s> n: - Attributs divers : %s" % (name,
infos)

(snip)



#----------
Ceci me renvoie :
tag : sousSection
attrssect id : 1
attrssect rubrik : 1
tag : sousSection
attrssect id : 1
attrssect rubrik : 1
tag : sousSection
attrssect id : 2
attrssect rubrik : 1
[...]

alors que les id numérotent les sous-sections et que le doc XML est
"bien-formé" du style :
<section id="1" name="Nom" description="blabla">
<sousSection id="1" rubrik="1" thema="mon thème">
<texte>texte</texte>
</sousSection>
<sousSection id="2" rubrik="1" thema="thème 2">
<texte>texte</texte>
</sousSection>



<meta>
"est du style" ?-)
Tu devrais poster (au moins un extrait) le fichier avec lequel tu a le
problème. Ou s'il est trop long, poster une url permettant de le consulter.
</meta>

J'ai par exemple deux fois "attrssect id" : 1, deux fois "attrssect id :
8", une fois les autres... C'est étrange.




S'il y a par exemple des sauts de lignes ou autres dans une portion
CDATA (-> le texte entre deux balises...), la methode character() sera
appelée plusieurs fois.

Auriez-vous une idée ?
Déjà, et sous réserve que tu en ai besoin pour autre chose (ce qui ne


semble pas être le cas), virer la balise <texte>

<section id="1" name="Nom" description="blabla">
<sousSection id="1" rubrik="1" thema="mon thème">
texte
</sousSection>
<sousSection id="2" rubrik="1" thema="thème 2">
texte
</sousSection>
</section>
<section id="2" name="Nom" description="blabla plus plus">
<sousSection id="1" rubrik="2" thema="mon autre thème">
texte
</sousSection>
</section>

etc...
(BTW, si l'attribut 'rubrik' de la balise <sousSection> est une
référence à l'id de la balise <section> parente, vire le aussi.)

Ensuite, modifier un peu ta classe:

def startElement(self, name, attr):
self._stack.append((name, attr))
self._deja_vu = False

def characters(self, text):
name, attr = self._stack[-1]
if name == "sousSection":
if not self._deja_vu:
print "tag : %s" % name
print "attrssect id : %s" % str(attr['id'])
print "attrssect rubrik : %s" % str(attr['rubrik'])
self._deja_vu = True
else:
# on est toujours dans la même sous-section
pass

def endElement(self, name):
self._stack.pop()
self._deja_vu = False


Pas testé, mais a priori ça devrait le faire...

Maintenant, plutôt que de répondre au cas par cas et sur des exemples ne
correspondant pas vraiment à la finalité de ce code, il serait peut-être
mieux que tu nous explique exactement ce que tu veux faire et
*comment* tu penses le faire...

Mes deux centimes
--
bruno desthuilliers
python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for
p in ''.split('@')])"


Avatar
remi
Bonjour et merci !

[snip]
<meta>
"est du style" ?-)
Tu devrais poster (au moins un extrait) le fichier avec lequel tu a le
problème. Ou s'il est trop long, poster une url permettant de le consulter.
</meta>


Oui, c'est vrai, désolé. Je le ferai la prochaine fois.


J'ai par exemple deux fois "attrssect id" : 1, deux fois "attrssect id :
8", une fois les autres... C'est étrange.




S'il y a par exemple des sauts de lignes ou autres dans une portion
CDATA (-> le texte entre deux balises...), la methode character() sera
appelée plusieurs fois.


Arf, d'accord, je comprends mieux. Faut-il alors que je mettre tout le
contenu texte (avec des sauts de ligne, des balises HTML...) dans un
<![CDATA[le contenu de mon texte]]> ?


Auriez-vous une idée ?



Déjà, et sous réserve que tu en ai besoin pour autre chose (ce qui ne
semble pas être le cas), virer la balise <texte>
[snip]

(BTW, si l'attribut 'rubrik' de la balise <sousSection> est une
référence à l'id de la balise <section> parente, vire le aussi.)


ben ça fait du ménage pour la même quantité d'infos contenues dans le
XML. En effet, ces balises ne me sont pas utiles !
(en plus tu m'avais déjà parlé de virer la balise <texte>... 2 centimes,
ok...)

Je mettais autant d'attribut que ce qu'il y a de cases à remplir dans la
db finale (vision bijective...)

Je vais tester le code proposé et reveins vers le forum (avec un lien
vers le code complet qui est trop long)
Merci.
@+
Rémi.