Bonjour,

J'ai un sacré problème avec XML je viens donc m'en remettre à vous. Suite au réponse données dans un précédent topic j'ai reussi parfaitement mon affichage grâce à une feuille de style XSL. Mais désormais je suis bloqué en amont.

PROBLEME I
Gràce à une boucle php, je crée un arbre XML qui contiens des informations contenus dans une base de donnée. J'utilise le code suivant:

$tree = new domDocument();
$include = new domelement('include');
$tree->appendChild($include);
while($tab = mysql_fetch_array($return))
 {
$billet = new domelement('billet');
$include->appendChild($billet);
$billet->setAttribute('date', $tab[$this->chp_date]);
$billet->setAttribute('titre', $tab[$this->chp_titre]);   
$texte = new domText();
$texte->appendData($tab[$this->chp_texte]);
$billet->appendChild($texte);
}   
print $tree->saveXML();


Ce code marche à une exception près : il ne rempli pas les balise <news> si le texte est trop long, en gros si il fait plus de quelques mots. Pour les textes court pas de soucis. Plutot que de creer un noeud de type texte j'ai essayer ça :
$billet->nodeValue = $tab[$this->chp_texte];
mais j'ai rencontré le même problème.

PROBLEME II
On m'a suggéré d'utiliser une DTD ou un schema (ce qui peut sembler légitime). J'ai donc rajouter des lignes à mon code :

$tree = new domDocument();
$include = new domelement('include');
$tree->appendChild($include);
$include->setAttribute('xmlns:xsi','http://www.w3.org/2001/XMLSchema-instance');
$include->setAttribute('xsi:noNamespaceSchemaLocation','inc/schem/billet.xsd');
while($tab = mysql_fetch_array($return))
{
$billet = new domelement('billet');
$include->appendChild($billet);
$billet->setAttribute('date', $tab[$this->chp_date]);
$billet->setAttribute('titre', $tab[$this->chp_titre]);
$texte->appendData($tab[$this->chp_texte]);
$billet->appendChild($texte);
}   
$tree->schemaValidate('inc/schem/billet.xsd');
print $tree->saveXML();


Et creer le fichier billet.xsd suivant :
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema.xsd">
  <xsd:element name="include">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="billet" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/>
      </xsd:sequence>
      <xsd:attribute name="date" type="xsd:date"/>
      <xsd:attribute name="titre" type="xsd:string"/>
    </xsd:complexType>
  </xsd:element> 
</xsd:schema>


J'ai alors droit à l'erreur suivant quand je j'appel ma page :

Warning: DOMDocument::schemaValidate() [function.DOMDocument-schemaValidate]: The file "/homepages/40/d160546917/htdocs/chat/inc/schem/billet.xsd" is not a XML schema. in /homepages/40/d160546917/htdocs/chat/inc/class/billet.php5 on line 121

Warning: DOMDocument::schemaValidate() [function.DOMDocument-schemaValidate]: Invalid Schema in /homepages/40/d160546917/htdocs/chat/inc/class/billet.php5 on line 121

J'ai découvert le xsd aujourd'hui donc le code présenter ci-dessus fera peut-être sourir les spécialistes, je m'en excuse.

Si quelqu'un à une/des réponses à mes questions, je lui en serait trés reconnaisssant. Merci d'avance.
Modifié par lanfisis (19 Jun 2006 - 22:14)
Problème 1 :
C'est absolument pas normal Smiley eek Et ton code est un peu louche, avec les "new DOMElement" et tout. Normalement, pour créer un élément, on passe par l'objet DOMDocument parent :
$billet = $tree->createElement('billet');


Essaye donc pour le contenu avec :
$billet->appendChild($tree->createTextNode($tab[$this->chp_texte]));


Problème 2 :
Attention, t'as foiré le namespace. Si tu rencontres des problèmes genre "si document is not a Smiley xxxxx ", dans 99% des cas, c'est le namespace qui est pas bon. Donc t'as rajouté un .xsd à la fin, alors qu'il ne faut pas :
http://www.w3.org/2001/XMLSchema

Attention, il ne faut pas oublier que le namespace n'est pas vraiment comme une URL : on ne peut pas omettre les www, ni utiliser w3c.org au lieu de w3.org. Normalement, un namespace est là pour identifier le langage XML utilisé. Alors évidemment, ce namespace doit être unique au monde, sinon catastrophe. Donc ils ont eu l'idée d'utiliser une URL... Mais on peut mettre totalement autre chose si on créer son propre langage
Smiley smile
Merci beaucoup pour ta rapidité à répondre. En revanche malgré les modification apportée le problème persiste. Il ne veux toujours pas mettre de textes long dans la balise.

Shame on me. Il s'avère que le problème venait simplement du fait que mes entrées dans la base contenait des caractères spéciaux qui plaisait pas. Erreur réparée Smiley smile
Modifié par lanfisis (19 Jun 2006 - 22:14)