apparition du xmlns

pierre sabatier
Invité n'ayant pas de compte PHPfrance

26 nov. 2007, 13:14

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?

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

29 nov. 2007, 09:27

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.

Invité
Invité n'ayant pas de compte PHPfrance

03 déc. 2007, 15:15

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.

pierre sabatier
Invité n'ayant pas de compte PHPfrance

03 déc. 2007, 15:43

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.

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

03 déc. 2007, 15:47

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>