Bonjour à tous,
Voila ce que ça donne en python :
#!/usr/bin/env python
#-*- coding:utf-8 -*-
import xml.sax
import tempfile
import re
str = """<ap:ressource xmlns:ap="http://patrimoines.aquitaine.fr/ap/format-pivot/1.1" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<ap:identifier>http://www.culture.gouv.fr/public/mistral/merimee_fr?ACTION=CHERCHER&FIELD_98=REF&VALUE_98=IA33001451</ap:identifier>
<ap:subject>Chavat</ap:subject>
<ap:subject>belvédère de jardin</ap:subject>
<ap:title>belvédère de jardin</ap:title>
<ap:locinsee code_insee="33327"/>
<ap:relation>IA33001449</ap:relation>
<ap:spatial> </ap:spatial>
<ap:periode>XXe siècle</ap:periode>
<ap:periode/>
<ap:datation>1916</ap:datation>
<ap:artiste>Marmisse Henri (architecte) ; Bouhana Charles (architecte paysagiste)</ap:artiste>
<ap:description>Rotonde édifiée sur le belvédère de jardin.Trois escaliers donnent accès à ce belvédère de jardin; entouré de catalpas. Les bancs en marbre blanc (il en reste deux sur trois) sculptés encerclent la rotonde de jardin; d'inspiration ionique; dit</ap:description>
<ap:media-typologie>notice</ap:media-typologie>
<ap:media-url> </ap:media-url>
<ap:rights>© Région Aquitaine - Inventaire général</ap:rights>
<ap:metier>service d'inventaire</ap:metier>
<ap:publisher>Service régional du patrimoine et de l'inventaire Aquitaine</ap:publisher>
<ap:language>fr_FR</ap:language>
<ap:source>Base Mérimée</ap:source>
<ap:typologieObjet>Batiment</ap:typologieObjet>
<ap:typologieObjet>Edifice</ap:typologieObjet>
</ap:ressource>"""
class MyHandler (xml.sax.handler.ContentHandler) :
def __init__(self, out_dir):
self.out_dir = out_dir
self.current = 0
self.generator = None
self.readIdentifier = False
def setDocumentLocator(self,locator):
pass
def startDocument(self):
pass
def endDocument(self):
if self.generator:
self.generator.endDocument()
pass
def startPrefixMapping(self,prefix,uri):
if self.generator:
self.generator.startPrefixMapping(prefix,uri)
pass
def enfPrefixMapping(self,prefix):
if self.generator:
self.generator.enfPrefixMapping(prefix)
pass
def startElement(self,name, attrs):
if name == "ap:ressource" :
self.tempfile = tempfile.NamedTemporaryFile(mode="rw+b",delete=False, bufsize=0)
self.generator = xml.sax.saxutils.XMLGenerator(self.tempfile)
self.generator.startDocument()
if name == "ap:identifier" :
self.readIdentifier = True
if self.generator:
self.generator.startElement(name,attrs)
pass
def endElement(self,name):
if self.generator:
self.generator.endElement(name)
if name == "ap:ressource" :
self.generator.endDocument()
f1 = open(self.tempfile.name,"r")
f = open(self.out_dir+"/"+self.file_name+".xml","w")
f.write(f1.read())
f.close()
f1.close()
self.file_name = ""
self.generator = None
pass
def startElementNS(self, name, qname, attrs):
if self.generator:
self.generator.startElementNS(name,qname,attrs)
pass
def endElementNS(self, name, qname):
if self.generator:
self.generator.endElementNS(name,qname)
pass
def characters(self, content):
if self.readIdentifier :
res = re.search("(IA[1234657980]*)",content)
if res:
print res.group(0)
self.file_name = res.group(0)
self.readIdentifier = False
if self.generator:
self.generator.characters(content)
pass
def ignorableWhitespace(self,whitespace):
if self.generator:
self.generator.ignorableWhitespace(whitespace)
pass
def processingInstruction(self, target, data):
if self.generator:
self.generator.processingInstruction(target,data)
pass
def skippedEntity(self, name):
if self.generator:
self.generator.skippedEntity(name)
pass
myParser = MyHandler("/export/home/mgautier/test")
xml.sax.parseString(str, myParser)
C'est un peu bourrin, il y a aucun test d'erreur et faudra probablement l'adapter un peu à tes besoins mais ça marche bien.
Étant donné que ça se base sur SAX pour parser le xml, c'est probablement plus sur que des script basés sur des regexp.
Par contre il faut modifier le fichier d'entré pour qu'il soit standardisé :
- Coter les liens dans ap:ressource
- remplacer les & par des & (le & étant un caractère réservé)
Un sed devrait probablement pouvoir réadapter le fichier d'entré. 😉
PS, je dit pas que les autres solutions marchent pas, seulement que je connais python et pas perl...