[XSD] : Apparition des éléments

Petit nouveau ! | 1 Messages

14 oct. 2009, 15:48

Bonjour,

Je tente en ce moment de recréer le zcode (une sorte de bbcode maison mais en utilisant des chevrons à la place des crochets), mais avec une gestion d'erreurs. Ce fameux zcode permet de mettre en forme du texte dans nos formulaires.

Mais je galère un peu pour valider le document à l'aide d'un fichier XSD. Pour le moment, de ce que j'ai pu voir, on doit coder le fichier XSD en fonction de l'ordre d'apparition des balises dans le document XML (pour moi, c'est plus une chaine XML afin d'aller plus vite au niveau traitement du message). Sauf qu'un membre peut ne mettre que du texte, mettre n'importe quelle balise (donc pas d'ordre d'apparition à suivre), imbriquer à l'infini la même balise ou des balises différentes etc..

C'est sûr ce genre de chose que je galère un peu.. Pour le moment, j'arrive seulement à valider le document selon l'ordre d'apparition, mais pas pour ce que je veux réellement (cité dans le paragraphe du dessus).

Pour info, voici le code actuel :
<?php
 
$xdoc = new DomDocument;
 
$xml = '<?xml version="1.0" encoding="UTF-8"?>
<zcode>
	<gras>XYZ Corp</gras>
</zcode>';
 
$xmlschema = 'C:/wamp/www/a/tag.xsd';
 
//Load the xml document in the DOMDocument object
if ($xdoc->LoadXML($xml))
{
	//Validate the XML file against the schema
	if ($xdoc->schemaValidate($xmlschema))
	{
		echo 'Le fichier XML est valide !!';
	}
	else
	{
		echo 'Le fichier XML est invalide...';
	}
}
else
{
	echo 'Erreur de LoadXML().';
}
 
?>
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
	<xsd:element name="zcode">
		<xsd:complexType>
			<xsd:sequence>
				<xsd:element ref="barre" />
				<xsd:element ref="gras" />
				<xsd:element ref="italique" />
				<xsd:element ref="souligne" />
			</xsd:sequence>
		</xsd:complexType>
	</xsd:element>
	
	<xsd:element name="barre" type="xsd:string" />
	<xsd:element name="gras" type="xsd:string" />
	<xsd:element name="italique" type="xsd:string" />
	<xsd:element name="souligne" type="xsd:string" />
</xsd:schema>

Avec ces deux codes, php me dit que c'est invalide car il s'attendait à voir la balise "barre", ce qui est mon soucis d'ordre d'apparition.

J'ai entendu parler de mixed="true" mais je ne sais pas trop si c'est en rapport avec ce que je veux.

En résumé :
  • Je ne veux pas que mes balises apparaissent dans un certains ordre.
  • Le texte retourné peut ne contenir que du texte. Ce qui nous laisse à penser qu'une balise peut ne pas apparaitre dans le texte, peut apparaitre une fois ou plus d'une fois (ça me fait penser à la logique propositionnelle.. )
  • Les balises peuvent s'imbriquer autant de fois que l'on désir, que ce soit avec la même balise ou avec des balises différentes.
Voilà, je crois que c'est tout pour le moment.
Merci d'avance si vous avez une idée pour mon problème.