Comment parser un fichier XML avec libxml ?
Je fournis ici un petit programme C (et son Makefile) permettant de parser le fichier exemple XML detector.xml.
Soit:
<!-- xml Detector description example --> <detector/> <info name="oner" title="Super detector" author="Ol." date="march 2024"> <comment>Only a xml file to show how to parse it ...</comment> </info> <detec id="0" name="Cap" type="Polygone" TrackingVolume="true"> <material name="Beryllium"/> <zplane rmin="1.2*cm" rmax="1.9*cm" z="-6.*cm"/> <zplane rmin="1.2*cm" rmax="1.3*cm" z="6.*cm" /> </detec> <detec id="0" name="Vertex" type="Tracker" readout="Hits"> <layer id="1" inner_r = "1.4*cm" outer_z = "6.25*cm"> <slice material = "Silicon" thickness = "0.008*cm"/> <slice material = "Silicon" thickness = "0.002*cm" sensitive = "yes" /> </layer> <layer id="2" inner_r = "2.5*cm" outer_z = "6.25*cm"> <slice material = "Silicon" thickness = "0.008*cm"/> <slice material = "Silicon" thickness = "0.002*cm" sensitive = "yes" /> </layer> </detec> </detector>
xmlNodePtr cur;
Si on se position au premier noeud
cur = xmlDocGetRootElement(doc);
nous devons avoir la condition:
if(!xmlStrcmp(cur->name, (const xmlChar *) "detector"))
vérifié sinon on sort du programme..
cur = cur->xmlChildrenNode;
Le contenu des champs des noeuds se fait avec xmlGetProp, par exemple
InnerRadius = xmlGetProp(cur,"inner_r")
nous donne la valeur du champ inner_r qui se trouve au noeud layer.
xmlNodeListGetString
Voilà pour essentiel …
Pour tester mon petit parser de demo: