Page 1 sur 1

apparition du xmlns

Posté : 26 nov. 2007, 13:14
par pierre sabatier
bonjour, j'utilise le DOMObject pour générer des documents XML.
voila une des méthodes de ma classe:
private function addServices (DOMElement $entry, array $_misc) {
		
		if ($_misc) {
			
		//	print_r ($_misc);
			$segments = $this->oDoc->createElement('Segments');
			
			$segments->setAttribute('What','Details');
			
			// niveau inferieur
			$entry = $entry->appendChild($segments);
			
			foreach ($_misc as $service) {
				
				$segment	= $this->oDoc->createElement('Segment');
				$segment->setAttribute('Quantity',count($service['occupant']));
				$segment->setAttributeNS(self::XMLNS,'xsi:type','SegmentServiceType');
				
				$entry1		= $entry->appendChild($segment);
				$this->addCode($entry1,'Reference',$service['code']);
				$entry2 = $entry1->appendChild($this->oDoc->createElement('Travellers'));
				
				foreach ($service['occupant'] as $pax) {
					
					$p = $this->oDoc->createElement('Traveller');
					$p->setAttribute('Ref',$pax);
					$entry2->appendChild($p);
				}
			}
		}
	}
C'est bien beau merci.
Mais j'obtiens un XML de ce style:

Code : Tout sélectionner

... <Segments> <Segment xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="Formule"> <Segments What="Details"> <Segment xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="SegmentServiceType" Quantity="5"> <Code Role="Reference" Value="1_MC"/> <Travellers> <Traveller Ref="P1"/> <Traveller Ref="P2"/> <Traveller Ref="P3"/> <Traveller Ref="P4"/> <Traveller Ref="P5"/> </Travellers> </Segment> </Segments> </Segment> </Segments> ...
avec, on ne sait pourquoi, des balises xmlns là où je ne le souhaite pas car, j'ai déjà à la racine ce xmlns:xsi, de plus. il se trouve afficher dans un <Segment Name="Formule"> alors que je n'ai jamais souhaité ça, c'est le plus étonnant.

Maintenant, si je commente la ligne:
$segment->setAttributeNS(self::XMLNS,'xsi:type','SegmentServiceType');
dans mon foreach, voila le résultat:

Code : Tout sélectionner

<Segment Name="Formule"> <Segments What="Details" Combination="And"> <Segment> <Code Role="Reference" Value="5_EXC"/> <Travellers> <Traveller Ref="P1"/> <Traveller Ref="P2"/> </Travellers> </Segment> </Segments> </Segment>
Le "xmlns:xsi" disparait au niveau du <Segment Name="Formule"> ( de toutes facons, il n'avait rien à faire là) et aussi au niveau du <Segment> sous-fils.
Quelqu'un a-t-il déjà eu de tels soucis, ou y-a-t-il une raison a cela, et comment faire pour ne plus obtenir ce problême?

Posté : 29 nov. 2007, 09:27
par Hubert Roksor
Pour les déclarations xmlns redondantes, c'est sûrement parce que tu utilises ce namespace avant d'avoir placé ton élément dans l'arbre : DOM ne sait pas si le futur parent du nœud possédera ou non le bon namespace et par conséquent le redéclare dans le nœud. Essaie de déplacer ton appendChild() avant setAttributeNS()

Pour le reste, DOM est très verbeux donc je n'ai pas vraiment compris comment tout marchait. Si ton nœud apparaît au mauvais endroit, l'explication la plus plausible est que tu t'es trompé de parent. Mon conseil : oublie DOM et utilise SimpleXML à la place, tellement plus pratique.

dom verbeux... VS simplexm

Posté : 03 déc. 2007, 15:15
par Invité
Dom est verbeux, ça c'est sûr!
Mais il permet de générer des objets DOMElement et de pouvoir les manipuler séparemment et ce facilement.
Par exemple, je peux créer 2 arborescences distinctes à partir des mêmes éléments lorsque je le souhaite, grâce à "appendChild". J'avais trouvé ça pratique.

merci pour la réponse

Posté : 03 déc. 2007, 15:43
par pierre sabatier
Pour les déclarations xmlns redondantes, c'est sûrement parce que tu utilises ce namespace avant d'avoir placé ton élément dans l'arbre : DOM ne sait pas si le futur parent du nœud possédera ou non le bon namespace et par conséquent le redéclare dans le nœud. Essaie de déplacer ton appendChild() avant setAttributeNS()

Pour le reste, DOM est très verbeux donc je n'ai pas vraiment compris comment tout marchait. Si ton nœud apparaît au mauvais endroit, l'explication la plus plausible est que tu t'es trompé de parent. Mon conseil : oublie DOM et utilise SimpleXML à la place, tellement plus pratique.
Merci, c'était bien ça, le noeud courant n'était pas attacher au document.

Re: dom verbeux... VS simplexm

Posté : 03 déc. 2007, 15:47
par Hubert Roksor
Par exemple, je peux créer 2 arborescences distinctes à partir des mêmes éléments lorsque je le souhaite, grâce à "appendChild"
Tu veux dire cloneChild() ? Sauf erreur de ma part, appendChild() ne fais que déplacer les éléments.

Sinon, regarde du côté de ce truc, ça met du DOM dans ton SimpleXML. eg
$root = new SXE(
	'<root>
		<a1><b><c /></b></a1>
		<a2 />
	</root>'
);

$root->a2->appendChild($root->a1->b);
...résultat

Code : Tout sélectionner

<?xml version="1.0"?> <root> <a1/> <a2><b><c/></b></a2> </root>