Est ce que tu peux essayer avec ceci :
et injecter $html dans ton document.Code:
1
2$html = mb_substr($xml, mb_strlen('<?xml version="1.0"?>') + 1); $html = html_entity_decode($html);
Version imprimable
Est ce que tu peux essayer avec ceci :
et injecter $html dans ton document.Code:
1
2$html = mb_substr($xml, mb_strlen('<?xml version="1.0"?>') + 1); $html = html_entity_decode($html);
Alors :
- j'utilise la version 4.03 de HTML2PDF
- Notepad m'indiquait ANSI pour l'encodage
J'utilise Netbeans au quotidien et ce n'est pas la première fois que je me rends compte que mes fichiers ne sont pas en UTF-8.
Il doit y avoir quelque chose à faire du côté du fichier de configuration.
Sur Netbeans, tu peux effectivement définir par défaut UTF-8.
Par contre si tu utilises une base de données qui n'est pas en UTF-8 et que tu as converti tes fichiers sources en UTF-8, tu risque d'avoir des problèmes maintenant.
Pour ne pas t'embrouiller avec les encodages, c'est simple : il faut être homogène sur toute la ligne :
- Fichiers PHP : UTF-8 sans BOM (utiliser les fonctions mb_* pour manipuler les chaines)
- Rendu web : charset="utf-8"
- Base de données : UTF-8
- S'assurer que toutes les librairies tiers tournent en UTF-8
Dès que tu romps cette homgénéité quelle que part, tu t'exposes à un problème d'encodage et tu deviens vite un galérien.
Merci pour tes propositions. J'ai juste affiché la sortie sur une page en var_dump et je viens de voir que j'ai plusieurs Warnings levés lors du loadXML :
Au 2ème warning, le local scope montre que ma variable contient bien toute la page pseudo-HTML.Citation:
Warning: DOMDocument::loadXML() [domdocument.loadxml]: Premature end of data in tag link line 1 in Entity
Warning: DOMDocument::loadXML() [domdocument.loadxml]: Premature end of data in tag link line 1 in Entity
Warning: DOMDocument::loadXML() [domdocument.loadxml]: Start tag expected, '<' not found in Entity, line: 2
AU 3ème, le local scope montre que la variable ne contient plus que l'en-tête :aie:
Du coup, le fait de retirer cette en-tête fait qu'à la fin ma variable contenant ma page est vide.Code:
1
2
3
4
5$xml = string '<?xml version="1.0"?> ' (length=22) $xpath = string '/ul/ul' (length=6)
Du coup, comme on semble se diriger vers une utilisation de loadXML, ne faut-il pas que j'utilise la notation suivante pour que ma variable ne pose pas de souci :
J'ai essayé, et ça ne fonctionne pas. Un var_dump avant le passage dans nestUl() montre que $html contient la même chose qu'avant et les warnings sont toujours là... :cry:Code:
1
2
3
4 $html =<<<XML $html XML;
Une idée?
Postes intégralement ton script stp.
Et si tu as des warning ça veut dire que ton fragment de code à modifier n'est pas correctement formaté.
Voilà : normalement tout est là
Je t'ai mis des commentaires pour que tu vois rapidement ce qui est fait : ça commence dans livret/export-livret.php.
Il y a des require que je n'ai pas mis, je les ai laissé pour que tu vois le script tel quel.
Merci encore du temps passé sur mon souci, et n'hésite pas si tu as besoin d'autre chose.
Ok une dernière question : sur quelle version de PHP ce script doit tourner ?
Le serveur de prod tourne en 5.2.13-pl1.
Alors pour que ça marche, il faut être très rigoureux question formatage xml.
C'est le langage qui veut ça (tant mieux)
Je me suis créé un fichier dvp.xml avec tes données que j'ai corrigé :
Les corrections :Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52 <data> <link type="text/css" href="../css/main-css.css" rel="stylesheet" /> <link type="text/css" href="css/livret.css" rel="stylesheet" /> <page backtop="0" backbottom="0" backimg="" backimgx="center" backimgy="middle" backimgw="100%"> <page_header> <div id="header-container"> <div id="macaron-container"><img src="images/macaron-projet.png" /></div> <div id="title"><h1>Test</h1></div> </div> </page_header> <page_footer> <div id="footer-container"></div> </page_footer> </page> <page backtop="216px" backbottom="250px" backimg="" backimgx="148mm" backimgy="middle" backimgw="100%" backcolor="#b9cc25"> <page_header> <div id="header-container"> <div id="macaron-container"><img src="images/macaron-projet.png" /></div> <div id="sumup-title"><h1 style="font-size:30pt">Test</h1></div> </div> </page_header> <page_footer> <div id="footer-container"></div> </page_footer> <div id="sumup"> <ol id="sumup-list"> <li><h1 style="font-size:20pt; text-transform: none;">test 1</h1></li> <li><h1 style="font-size:20pt; text-transform: none;">test 2</h1></li> </ol> </div> </page> <page backtop="220px" backbottom="220px" backright="100px" backleft="100px" style="font-size: 15pt"> <page_header> <div id="body-page-header-container"> <div id="macaron-container"><img src="images/macaron-projet.png" /></div> <div id="number"><h1 style="font-size:80pt;">1</h1></div> <div id="title"><h1 style="font-size: 40pt;">sdqsd sq</h1></div> </div> </page_header> <page_footer> <div id="footer-container"></div> </page_footer> <ul> <li>qsdqsd</li> <li>qsdqsdqsd</li> <li>qsdqsd</li> <ul> <li>qsdqssqdqsqsd</li> </ul> </ul> </page> </data>
- il fallait rajouter une racine aux données xml <data></data>,
- les tags <link> n'étaient pas bien formés : c'est <link />.
Ensuite j'ai modifié un peu la fonction :
Chez moi j'obtiens ce que tu souhaites malgré la qualité du formatage. Ce genre de laisser-aller se paye un jour comme aujourd'hui où il faut bidouiller pour s'en sortir.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24function nestUl($xml, $xpath) { $dom = new DOMDocument(); $dom->loadXML($xml); $dom_xpath = new DOMXPath($dom); $nodes = $dom_xpath->query($xpath); foreach($nodes as $node) { $li = $dom->createElement('li'); $li->appendChild($node->cloneNode(true)); $node->parentNode->replaceChild($li, $node); } return $dom->saveXML(); } $data = file_get_contents('dvpb.xml'); $xml = nestUl($data, 'ul/ul'); $xml = nestUl($xml, '//ul/ul'); /** on retire à l'arrache l'en-tête <?xml version="1.0"?> et les <data></data> */ // len en-tête=21, <data>=6, </data>=7 $html = mb_substr($xml, 27+2, mb_strlen($html)-9); echo $html;
Allez bon courage
Merci beaucoup pour ton aide !
Ca fonctionne maintenant. :) Me reste à adapter le xpath pour qu'il gère n'importe quelle profondeur de sous-liste... Normalement '//ul/ul' devrait me retourner toutes les ul contenues dans ne autre ul directement et ce sans contrainte d'arborescence non?
Dans tous les cas, je le passe en résolu. :ccool:
Merci encore !
Content que tu en sois arrivé à bout.
Pour le XPath : un petit résumé ici
Et oui pour ta question.