{"id":21,"date":"2015-01-22T18:04:40","date_gmt":"2015-01-22T18:04:40","guid":{"rendered":"http:\/\/habett.fr\/wordpress\/?p=21"},"modified":"2015-01-22T18:04:40","modified_gmt":"2015-01-22T18:04:40","slug":"double-iterateur","status":"publish","type":"post","link":"https:\/\/habett.fr\/blog\/2015\/01\/double-iterateur\/","title":{"rendered":"Double It\u00e9rateur"},"content":{"rendered":"<p>Je travaille \u00e0 nouveau sur des codes, cette fois \u00e0 partir du XML de la base Legi. Je vais mettre ici plusieurs morceaux du code. Aujourd&rsquo;hui voici un exemple d&rsquo;un patern de programmation que j&rsquo;utilise beaucoup ces temps-ci, les it\u00e9rateurs, ici dans une variante \u00e0 double profondeur. A la base je r\u00e9cup\u00e8re une liste d&rsquo;\u00e9l\u00e9ments sans volume, des titres de niveaux variables et des articles de code. Il arrive que certaines branches de l&rsquo;arborescence de titre soient vides car les articles qu&rsquo;elles contenaient ont \u00e9t\u00e9 abrog\u00e9s. Une approche aurait consist\u00e9 de donner du volume \u00e0 cette cette liste de titres en fonction de leurs niveaux d&rsquo;importance mais cela aurait \u00e9t\u00e9 inutile car le but est ensuite de g\u00e9n\u00e9rer des PDF avec FOP et des EPubs avec perl. Bref, il faut supprimer certains titres car ils sont inutiles selon mes crit\u00e8res de droit positif.<\/p>\n<p>$d est mon document vu en perl par XML::LibXML.<br \/>\n$root = $dom-&gt;getDocumentElement();<br \/>\n(@nodes) = $root-&gt;childNodes();<br \/>\nwhile ($node = shift(@nodes)) {<br \/>\n#iterateur principal<br \/>\nif ($node-&gt;nodeType ==3) {<br \/>\n#Si c&rsquo;est une node de texte je la supprime si elle ne contient pas de texte<br \/>\n$node-&gt;parentNode-&gt;removeChild($node) unless($node-&gt;textContent =~ \/\\[\\w\\-]\/);<br \/>\n} else {<br \/>\nif ($node-&gt;nodeName =~ \/^h(\\d)\/) {<br \/>\n#Si c&rsquo;est un titre, j&rsquo;en inspecte le niveau hi\u00e9rarchique.<br \/>\n$level = $1;<br \/>\nmy @charette;<br \/>\n#Je pr\u00e9pare une charette dans laquel je mettrai l&rsquo;hypoth\u00e9tique lot \u00e0 supprimer si effectivement le soul arbre ne contient pas d&rsquo;articles.<br \/>\nmy @copie = @nodes<br \/>\n#Je fais une copie de mon nodeset pour it\u00e9rer dans ses sous branches.<br \/>\nwhile ($cand = shift(@node)) {<br \/>\n#It\u00e9rateur secondaire<br \/>\n$ca = $cand-&gt;nodeName;<br \/>\nlast() if ($ca eq &lsquo;article&rsquo;);<br \/>\n#Je sors de l&rsquo;it\u00e9rateur si un des enfants est un article<br \/>\nif (($ca =~ \/hash(\\d)\/) and ($1 &gt; $level)) {<br \/>\n#Si c&rsquo;est un sous branche je l&rsquo;inscrit \u00e0 la charette sans la supprimer.<br \/>\npush(@charette,$cand);<br \/>\n}<br \/>\nif (($ca =~ \/hash(\\d)\/) and ($1 &lt;= $level)) {<br \/>\n#Si c&rsquo;est un titre de niveau \u00e9gal ou sup\u00e9rieur, je vide la charette je supprime les nodes<br \/>\nmap {<br \/>\n$_-&gt;parentNode-&gt;removeChild($_);<br \/>\n} @charette;<br \/>\n$node-&gt;parentNode-&gt;removeChild($node);<br \/>\n}<br \/>\n}<br \/>\n}<br \/>\n}<br \/>\n}<\/p>\n<p>Pas si compliqu\u00e9 que cela, j&rsquo;ai juste longtemps h\u00e9sit\u00e9 sur la copie.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Je travaille \u00e0 nouveau sur des codes, cette fois \u00e0 partir du XML de la base Legi. Je vais mettre ici plusieurs morceaux du code. Aujourd&rsquo;hui voici un exemple d&rsquo;un patern de programmation que j&rsquo;utilise beaucoup ces temps-ci, les it\u00e9rateurs, ici dans une variante \u00e0 double profondeur. A la base je r\u00e9cup\u00e8re une liste d&rsquo;\u00e9l\u00e9ments &hellip; <a href=\"https:\/\/habett.fr\/blog\/2015\/01\/double-iterateur\/\" class=\"more-link\">Continuer la lecture de <span class=\"screen-reader-text\">Double It\u00e9rateur<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2],"tags":[],"class_list":["post-21","post","type-post","status-publish","format-standard","hentry","category-archives"],"_links":{"self":[{"href":"https:\/\/habett.fr\/blog\/wp-json\/wp\/v2\/posts\/21","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/habett.fr\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/habett.fr\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/habett.fr\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/habett.fr\/blog\/wp-json\/wp\/v2\/comments?post=21"}],"version-history":[{"count":1,"href":"https:\/\/habett.fr\/blog\/wp-json\/wp\/v2\/posts\/21\/revisions"}],"predecessor-version":[{"id":22,"href":"https:\/\/habett.fr\/blog\/wp-json\/wp\/v2\/posts\/21\/revisions\/22"}],"wp:attachment":[{"href":"https:\/\/habett.fr\/blog\/wp-json\/wp\/v2\/media?parent=21"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/habett.fr\/blog\/wp-json\/wp\/v2\/categories?post=21"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/habett.fr\/blog\/wp-json\/wp\/v2\/tags?post=21"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}