[SimpleXml, Xpath] récupération valeur d'un attribut

récupération valeur d'un attribut [SimpleXml, Xpath] - PHP - Programmation

Marsh Posté le 14-04-2010 à 13:37:59    

Bonjour à tous,
 
Je suis actuellement en train de faire un petit outil de parsing de fichiers xml, pdml plus précisement mais c'est pareil. Cet outil me servira à traduire des exports de captures de traffic wireshark dans le but de faire une expertise par la suite. Je me suis donc collé depuis 3 jours à simpleXML pour récupérer les données dont j'ai besoin dans mon xml dont voici la structure :

Code :
  1. <?xml version="1.0"?>
  2. <pdml version="0" creator="wireshark/1.0.5">
  3. <packet>
  4.   <proto name="geninfo" pos="0" showname="General information" size="73">
  5.     <field name="num" pos="0" show="492" showname="Number" value="1ec" size="73"/>
  6.     <field name="len" pos="0" show="73" showname="Packet Length" value="49" size="73"/>
  7.     <field name="caplen" pos="0" show="73" showname="Captured Length" value="49" size="73"/>
  8.     <field name="timestamp" pos="0" show="Mar 26, 2010 12:00:01.813697000" showname="Captured Time" value="1269601201.813697000" size="73"/>
  9.   </proto>
  10.   <proto name="frame" showname="Frame 492 (73 bytes on wire, 73 bytes captured)" size="73" pos="0">
  11.     <field name="frame.time" showname="Arrival Time: Mar 26, 2010 12:00:01.813697000" size="0" pos="0" show="Mar 26, 2010 12:00:01.813697000"/>
  12.     <field name="frame.time_delta" showname="Time delta from previous captured frame: 0.010582000 seconds" size="0" pos="0" show="0.010582000"/>
  13.     <field name="frame.time_delta_displayed" showname="Time delta from previous displayed frame: 1.167821000 seconds" size="0" pos="0" show="1.167821000"/>
  14.     <field name="frame.time_relative" showname="Time since reference or first frame: 1.167821000 seconds" size="0" pos="0" show="1.167821000"/>
  15.     <field name="frame.number" showname="Frame Number: 492" size="0" pos="0" show="492"/>
  16.     <field name="frame.pkt_len" showname="Packet Length: 73 bytes" hide="yes" size="0" pos="0" show="73"/>
  17.     <field name="frame.len" showname="Frame Length: 73 bytes" size="0" pos="0" show="73"/>
  18.     <field name="frame.cap_len" showname="Capture Length: 73 bytes" size="0" pos="0" show="73"/>
  19.     <field name="frame.marked" showname="Frame is marked: False" size="0" pos="0" show="0"/>
  20.     <field name="frame.protocols" showname="Protocols in frame: eth:ip:tcp:x11" size="0" pos="0" show="eth:ip:tcp:x11"/>
  21.     <field name="frame.coloring_rule.name" showname="Coloring Rule Name: TCP" size="0" pos="0" show="TCP"/>
  22.     <field name="frame.coloring_rule.string" showname="Coloring Rule String: tcp" size="0" pos="0" show="tcp"/>
  23.   </proto>
  24.   <proto name="eth" showname="Ethernet II, Src: Broadcom_2d:5b:91 (00:10:18:2d:5b:91), Dst: All-HSRP-routers_02 (00:00:0c:07:ac:02)" size="14" pos="0">
  25.     <field name="eth.dst" showname="Destination: All-HSRP-routers_02 (00:00:0c:07:ac:02)" size="6" pos="0" show="00:00:0c:07:ac:02" value="00000c07ac02">
  26.       <field name="eth.addr" showname="Address: All-HSRP-routers_02 (00:00:0c:07:ac:02)" size="6" pos="0" show="00:00:0c:07:ac:02" value="00000c07ac02"/>
  27.       <field name="eth.ig" showname=".... ...0 .... .... .... .... = IG bit: Individual address (unicast)" size="3" pos="0" show="0" value="0" unmaskedvalue="00000c"/>
  28.       <field name="eth.lg" showname=".... ..0. .... .... .... .... = LG bit: Globally unique address (factory default)" size="3" pos="0" show="0" value="0" unmaskedvalue="00000c"/>
  29.     </field>
  30.     <field name="eth.src" showname="Source: Broadcom_2d:5b:91 (00:10:18:2d:5b:91)" size="6" pos="6" show="00:10:18:2d:5b:91" value="0010182d5b91">
  31.       <field name="eth.addr" showname="Address: Broadcom_2d:5b:91 (00:10:18:2d:5b:91)" size="6" pos="6" show="00:10:18:2d:5b:91" value="0010182d5b91"/>
  32.       <field name="eth.ig" showname=".... ...0 .... .... .... .... = IG bit: Individual address (unicast)" size="3" pos="6" show="0" value="0" unmaskedvalue="001018"/>
  33.       <field name="eth.lg" showname=".... ..0. .... .... .... .... = LG bit: Globally unique address (factory default)" size="3" pos="6" show="0" value="0" unmaskedvalue="001018"/>
  34.     </field>
  35.     <field name="eth.type" showname="Type: IP (0x0800)" size="2" pos="12" show="0x0800" value="0800"/>
  36.   </proto>
  37.   <proto name="ip" showname="Internet Protocol, Src: x.x.x.121 (x.x.x.121), Dst: x.x.x.146 (x.x.x.146)" size="20" pos="14">
  38.     <field name="ip.version" showname="Version: 4" size="1" pos="14" show="4" value="45"/>
  39.     <field name="ip.hdr_len" showname="Header length: 20 bytes" size="1" pos="14" show="20" value="45"/>
  40.     <field name="ip.dsfield" showname="Differentiated Services Field: 0x00 (DSCP 0x00: Default; ECN: 0x00)" size="1" pos="15" show="0" value="00">
  41.       <field name="ip.dsfield.dscp" showname="0000 00.. = Differentiated Services Codepoint: Default (0x00)" size="1" pos="15" show="0x00" value="0" unmaskedvalue="00"/>
  42.       <field name="ip.dsfield.ect" showname=".... ..0. = ECN-Capable Transport (ECT): 0" size="1" pos="15" show="0" value="0" unmaskedvalue="00"/>
  43.       <field name="ip.dsfield.ce" showname=".... ...0 = ECN-CE: 0" size="1" pos="15" show="0" value="0" unmaskedvalue="00"/>
  44.     </field>
  45.     <field name="ip.len" showname="Total Length: 59" size="2" pos="16" show="59" value="003b"/>
  46.     <field name="ip.id" showname="Identification: 0x1682 (5762)" size="2" pos="18" show="0x1682" value="1682"/>
  47.     <field name="ip.flags" showname="Flags: 0x04 (Don&apos;t Fragment)" size="1" pos="20" show="0x04" value="40">
  48.       <field name="ip.flags.rb" showname="0... = Reserved bit: Not set" size="1" pos="20" show="0" value="0" unmaskedvalue="40"/>
  49.       <field name="ip.flags.df" showname=".1.. = Don&apos;t fragment: Set" size="1" pos="20" show="1" value="1" unmaskedvalue="40"/>
  50.       <field name="ip.flags.mf" showname="..0. = More fragments: Not set" size="1" pos="20" show="0" value="0" unmaskedvalue="40"/>
  51.     </field>
  52.     <field name="ip.frag_offset" showname="Fragment offset: 0" size="2" pos="20" show="0" value="4000"/>
  53.     <field name="ip.ttl" showname="Time to live: 64" size="1" pos="22" show="64" value="40"/>
  54.     <field name="ip.proto" showname="Protocol: TCP (0x06)" size="1" pos="23" show="0x06" value="06"/>
  55.     <field name="ip.checksum" showname="Header checksum: 0x885d [correct]" size="2" pos="24" show="0x885d" value="885d">
  56.       <field name="ip.checksum_good" showname="Good: True" size="2" pos="24" show="1" value="885d"/>
  57.       <field name="ip.checksum_bad" showname="Bad : False" size="2" pos="24" show="0" value="885d"/>
  58.     </field>
  59.     <field name="ip.src" showname="Source: x.x.x.121 (x.x.x.121)" size="4" pos="26" show="x.x.x.121" value="a3692a79"/>
  60.     <field name="ip.addr" showname="Source or Destination Address: x.x.x.121 (x.x.x.121)" hide="yes" size="4" pos="26" show="x.x.x.121" value="a3692a79"/>
  61.     <field name="ip.src_host" showname="Source Host: x.x.x.121" hide="yes" size="4" pos="26" show="x.x.x.121" value="a3692a79"/>
  62.     <field name="ip.host" showname="Source or Destination Host: x.x.x.121" hide="yes" size="4" pos="26" show="x.x.x.121" value="a3692a79"/>
  63.     <field name="ip.dst" showname="Destination: x.x.x.146 (x.x.x.146)" size="4" pos="30" show="x.x.x.146" value="a3692a92"/>
  64.     <field name="ip.addr" showname="Source or Destination Address: x.x.x.146 (x.x.x.146)" hide="yes" size="4" pos="30" show="x.x.x.146" value="a3692a92"/>
  65.     <field name="ip.dst_host" showname="Destination Host: x.x.x.146" hide="yes" size="4" pos="30" show="x.x.x.146" value="a3692a92"/>
  66.     <field name="ip.host" showname="Source or Destination Host: x.x.x.146" hide="yes" size="4" pos="30" show="x.x.x.146" value="a3692a92"/>
  67.   </proto>
  68.   <proto name="tcp" showname="Transmission Control Protocol, Src Port: 46616 (46616), Dst Port: 6002 (6002), Seq: 1, Ack: 1, Len: 7" size="32" pos="34">
  69.     <field name="tcp.srcport" showname="Source port: 46616 (46616)" size="2" pos="34" show="46616" value="b618"/>
  70.     <field name="tcp.dstport" showname="Destination port: 6002 (6002)" size="2" pos="36" show="6002" value="1772"/>
  71.     <field name="tcp.port" showname="Source or Destination Port: 46616" hide="yes" size="2" pos="34" show="46616" value="b618"/>
  72.     <field name="tcp.port" showname="Source or Destination Port: 6002" hide="yes" size="2" pos="36" show="6002" value="1772"/>
  73.     <field name="tcp.len" showname="TCP Segment Len: 7" hide="yes" size="4" pos="34" show="7" value="b6181772"/>
  74.     <field name="tcp.seq" showname="Sequence number: 1    (relative sequence number)" size="4" pos="38" show="1" value="651de7e0"/>
  75.     <field name="tcp.nxtseq" showname="Next sequence number: 8    (relative sequence number)" size="0" pos="34" show="8"/>
  76.     <field name="tcp.ack" showname="Acknowledgement number: 1    (relative ack number)" size="4" pos="42" show="1" value="d910fc54"/>
  77.     <field name="tcp.hdr_len" showname="Header length: 32 bytes" size="1" pos="46" show="32" value="80"/>
  78.     <field name="tcp.flags" showname="Flags: 0x18 (PSH, ACK)" size="1" pos="47" show="0x18" value="18">
  79.       <field name="tcp.flags.cwr" showname="0... .... = Congestion Window Reduced (CWR): Not set" size="1" pos="47" show="0" value="0" unmaskedvalue="18"/>
  80.       <field name="tcp.flags.ecn" showname=".0.. .... = ECN-Echo: Not set" size="1" pos="47" show="0" value="0" unmaskedvalue="18"/>
  81.       <field name="tcp.flags.urg" showname="..0. .... = Urgent: Not set" size="1" pos="47" show="0" value="0" unmaskedvalue="18"/>
  82.       <field name="tcp.flags.ack" showname="...1 .... = Acknowledgment: Set" size="1" pos="47" show="1" value="1" unmaskedvalue="18"/>
  83.       <field name="tcp.flags.push" showname=".... 1... = Push: Set" size="1" pos="47" show="1" value="1" unmaskedvalue="18"/>
  84.       <field name="tcp.flags.reset" showname=".... .0.. = Reset: Not set" size="1" pos="47" show="0" value="0" unmaskedvalue="18"/>
  85.       <field name="tcp.flags.syn" showname=".... ..0. = Syn: Not set" size="1" pos="47" show="0" value="0" unmaskedvalue="18"/>
  86.       <field name="tcp.flags.fin" showname=".... ...0 = Fin: Not set" size="1" pos="47" show="0" value="0" unmaskedvalue="18"/>
  87.     </field>
  88.     <field name="tcp.window_size" showname="Window size: 46" size="2" pos="48" show="46" value="002e"/>
  89.     <field name="tcp.checksum" showname="Checksum: 0x12db [correct]" size="2" pos="50" show="0x12db" value="12db">
  90.       <field name="tcp.checksum_good" showname="Good Checksum: True" size="2" pos="50" show="1" value="12db"/>
  91.       <field name="tcp.checksum_bad" showname="Bad Checksum: False" size="2" pos="50" show="0" value="12db"/>
  92.     </field>
  93.     <field name="tcp.options" showname="Options: (12 bytes)" size="12" pos="54" show="01:01:08:0a:72:f5:17:1d:08:13:af:24" value="0101080a72f5171d0813af24">
  94.       <field name="" show="NOP" size="1" pos="54" value="01"/>
  95.       <field name="" show="NOP" size="1" pos="55" value="01"/>
  96.       <field name="tcp.options.time_stamp" showname="TCP Time Stamp Option: True" hide="yes" size="10" pos="56" show="1" value="080a72f5171d0813af24"/>
  97.       <field name="" show="Timestamps: TSval 1928664861, TSecr 135507748" size="10" pos="56" value="080a72f5171d0813af24"/>
  98.     </field>
  99.     <field name="" show="TCP segment data (7 bytes)" size="7" pos="66" value="1b8013045b0a0d"/>  </proto>
  100. </packet>
  101. <packet>
  102. ...
  103. </packet>
  104. ...
  105. </pdml>


 
Je souhaiterai pour chaque <packet> récupérer plusieurs informations et les mettre en ligne dans un tableau.
J'ai donc deja fait ça :

Code :
  1. <?php
  2. $xml = simplexml_load_file("fichier.pdml" )
  3. foreach ($xml -> packet as $packet )
  4. {
  5. echo "<tr>";
  6. echo "<td>".$packet->proto[0]->field[0]->attributes()->show."</td>";  //Numéro de trame
  7. echo "<td>".$packet->proto[3]->field[10]->attributes()->show."</td>";  //adresse ip source
  8. echo "<td>".$packet->proto[3]->field[14]->attributes()->show."</td>";  //adresse ip destination
  9. echo "<td>".$packet->proto[4]->field[0]->attributes()->show."</td>";  // port source
  10. echo "<td>".$packet->proto[4]->field[1]->attributes()->show."</td>";  // port destination
  11. // --> requete pour récupérer la valeur de 'value' de l'élément <field ... pos="66"...value="ce que je veux">
  12. echo "</tr>";
  13. }
  14. ?>


 
Mon problème c'est : comment récupérer la valeur de l'attribut 'value' de l'élément <field ... pos="66"...value="ce que je veux"...> dans ma boucle foreach
 
Je ne peux pas fixer le chemin d'accès en dure ( $packet->proto[x]->field[y]->attributes()->value) comme pour les autres valeurs récupéré car cet élément-ci n'est pas forcément présent dans chaque <packet> ou alors il bouge (position field[13] ou [14], je dois donc réaliser une requete xpath?
j'ai essayé d'introduire une requete xpath dans mon foreach mais ça ne fonctionne pas, ou alors si ça fonctionne ça me liste tous les 'value' de l'élément selectionné présent dans tout le fichier.
 
Enfin voila, beaucoup de questions pour un naz du php commemoi. S'il vous plait merci de m'éclairer je bloque depuis 3 jours et j'en peux plus !!
Merci infiniment.


Message édité par Pierre2Toulouse le 14-04-2010 à 13:42:07
Reply

Marsh Posté le 14-04-2010 à 13:37:59   

Reply

Marsh Posté le 14-04-2010 à 17:42:56    

pour moi, chaque élément de ce type :

Code :
  1. $packet->proto[4]

est un objet SimpleXmlelement
Après tu peux sans doute faire :

Code :
  1. $packet->proto[4]->xpath("//field[@value!='']" );

Reply

Marsh Posté le 14-04-2010 à 19:11:43    

Merci pour ta réponse rapide the_bigboo!
Ta requete écrite comme ça:

Code :
  1. echo  "<td>".$packet->proto[4]->xpath('//field[@value!=""]')."</td>";


 
me retourne un tableau rempli avec "Array"
De toute façon dans le proto[4] il n'y a pas qu'un seul value. Ce que je voudrais c'est récupérer le contenue de l'attribut value de l'élément <flied... pos="66"...> pour chaque paquet. avec l'écriture classique il me semble que ce n'est pas possible puisque cet élément est mobile ou absent en fonction des paquets...
Donc avec du xpath il me faudrait tester à chaque itération dans ma boucle foreach qui retourne le <packet> entier mais comment ?  
 
Je commence à me mélanger les pinceaux et à devenir... :pt1cable: :bounce:

Reply

Marsh Posté le 14-04-2010 à 20:26:13    

Attention, ce que je t'ai donné n'est pas la version finale, il y a surement des choses à changer :) La preuve ca ne marche pas :)
 
Après tu dois lire la doc du fonctionnement de xpath :)
 
Mais ca a l'air tout à fait faisable !

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed