Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 10/09/2022, à 13:17

alex2423

[XMLLINT] Quel chemin xpath pour récupérer une valeur d'un xml ?

Hello tout le monde,


J'aimerai parser un fichier XML (fichier xmp généré par Darktable).
Exemple :

$ cat 20220901_082414.xmp
<?xml version="1.0" encoding="UTF-8"?>
<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="XMP Core 4.4.0-Exiv2">
 <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
  <rdf:Description rdf:about=""
    xmlns:exif="http://ns.adobe.com/exif/1.0/"
    xmlns:xmp="http://ns.adobe.com/xap/1.0/"
    xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/"
    xmlns:darktable="http://darktable.sf.net/"
    xmlns:dc="http://purl.org/dc/elements/1.1/"
   exif:DateTimeOriginal="2022:09:01 08:24:14"
   xmp:Rating="1"
   xmpMM:DerivedFrom="20220901_082414.jpg"
   darktable:import_timestamp="1662759265"
   darktable:change_timestamp="-1"
   darktable:export_timestamp="-1"
   darktable:print_timestamp="-1"
   darktable:xmp_version="4"
   darktable:raw_params="0"
   darktable:auto_presets_applied="0"
   darktable:history_end="0"
   darktable:iop_order_version="2">
   <darktable:masks_history>
    <rdf:Seq/>
   </darktable:masks_history>
   <darktable:history>
    <rdf:Seq/>
   </darktable:history>
   <dc:title>
    <rdf:Alt>
     <rdf:li xml:lang="x-default">titre darktable</rdf:li>
    </rdf:Alt>
   </dc:title>
   <dc:description>
    <rdf:Alt>
     <rdf:li xml:lang="x-default">description darktable</rdf:li>
    </rdf:Alt>
   </dc:description>
  </rdf:Description>
 </rdf:RDF>
</x:xmpmeta>

J'aimerais bien récupérer la description (et donc la valeur ici : description darktable).

J'ai essayé le chemin :

/x:xmpmeta/rdf:RDF/rdf:Description/dc:description/rdf:Alt/rdf:li

et sans les préfixe :

/xmpmeta/RDF/Description/description/Alt/li

Quel serait le chemin à utiliser ?

kfocal@kfocal:/home/focal/Pictures/Alt Aragon$ cat 20220901_082414.xmp | xmllint --xpath /x:xmpmeta/rdf:RDF/rdf:Description/dc:description/rdf:Alt/rdf:li -
XPath error : Undefined namespace prefix
XPath evaluation failure
kfocal@kfocal:/home/focal/Pictures/Alt Aragon$ cat 20220901_082414.xmp | xmllint --xpath /xmpmeta/RDF/Description/description/Alt/li -
XPath set is empt

J'ai trouvé un outil en ligne pour m'aider à identifier le chemin :
https://www.easycodeforall.com/generate-xpath.html
mais sans succès. sad. J'ai l'impression que j'ai oublié quelque chose

Quel serait le chemin à utiliser ?

Dernière modification par alex2423 (Le 10/09/2022, à 13:20)

Hors ligne

#2 Le 10/09/2022, à 21:30

LeoMajor

Re : [XMLLINT] Quel chemin xpath pour récupérer une valeur d'un xml ?

salut,
avec xmllint, je ne sais pas.
le xml obéit a des règles plus strictes que le html. 

:~$ gbs3 -u 'gb.xml,gb.xml.html' -e 'dim d as new htmldocument: d.open("/tmp/exemple.xml"): print d.root.getchildrenbyTagname("rdf" & chr(58) & "li")[1].value'
description darktable

le deuxième "xmlElement" de la liste qui valide "rdf:li"

Hors ligne

#3 Le 23/09/2022, à 18:58

LeoMajor

Re : [XMLLINT] Quel chemin xpath pour récupérer une valeur d'un xml ?

:~$ gbs3 -u 'gb.xml' -e 'dim d as new xmldocument: d.open("/tmp/exemple.xml"): print d.root.getchildrenbyTagname("rdf" & chr(&h3a) & "li")[1].value' 
description darktable

:~$ xmllint --xpath "(//*[local-name()='li'])[2]/text()" /tmp/exemple.xml
description darktable

:~$ xmllint --xpath "(//*[name()='rdf:li'])[2]/text()" /tmp/exemple.xml
description darktable 

-----
from bs4 import BeautifulSoup
f=open("/tmp/exemple.xml", 'r')
html_doc = f.read()
f.close()
s=BeautifulSoup(html_doc,'html.parser')
print(s.find_all('rdf:li')[1].text)

Hors ligne