#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. . 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