2009-06-15 3 views
2

Je travaille sur un webservice XML (en PHP!), Et pour faire les choses correctement, je veux utiliser XMLWriter au lieu de simplement concaténer des chaînes et espérer le meilleur. J'utilise partout des espaces de noms XML en utilisant -> startElementNS et -> writeElementNS. Le problème, c'est que chaque fois que j'utilise ces fonctions, une nouvelle déclaration d'espace de nommage est également en cours d'écriture.Suivi des déclarations d'espace de noms avec XMLWriter

Bien que cette syntaxe soit correcte, c'est un peu inutile. Je voudrais m'assurer que ma déclaration d'espace de noms n'est écrite que la première fois qu'elle est utilisée dans le contexte d'un document.

Existe-t-il un moyen facile d'y parvenir avec XMLWriter, ou suis-je coincé sous-classer cela et gérer cela manuellement.

Merci, Evert

Répondre

6

Vous pouvez passer NULL comme paramètre uri.

<?php 
$w = new XMLWriter; 
$w->openMemory(); 
$w->setIndent(true); 
$w->startElementNS('foo', 'bar', ' http://whatever/foo '); 
$w->startElementNS('foo', 'baz', null); 
$w->endElement(); 
$w->endElement(); 
echo $w->outputMemory();
impressions
<foo:bar xmlns:foo="http://whatever/foo"> 
<foo:baz/> 
</foo:bar>

+0

Pas exactement ce que je cherche. Dans votre exemple, les éléments 'bar' et 'baz' peuvent être implémentés par des objets et des méthodes complètement différents qui ne sont pas toujours conscients les uns des autres. Je __always__ souhaite spécifier l'espace de noms, mais je veux qu'il ne restitue que le première fois. – Evert

+0

Je n'ai trouvé aucun support pour cela dans php/xmlwriter ou libxml/xmlwriter. Vous devez probablement suivre cela vous-même. – VolkerK

6

Vous pouvez écrire l'espace de noms une fois dans l'emplacement voulu dans le document, F.E. dans l'élément supérieur:

$writer = new XMLWriter(); 
$writer->openURI('php://output'); 
$writer->startDocument('1.0'); 

$writer->startElement('sample');    
$writer->writeAttributeNS('xmlns','foo', null,'http://foo.org/ns/foo#'); 
$writer->writeAttributeNS('xmlns','bar', null, 'http://foo.org/ns/bar#'); 

$writer->writeElementNS('foo','quz', null,'stuff here'); 
$writer->writeElementNS('bar','quz', null,'stuff there'); 

$writer->endElement(); 
$writer->endDocument(); 
$writer->flush(true); 

Cela devrait finir par quelque chose comme

<?xml version="1.0"?> 
<sample xmlns:foo="http://foo.org/ns/foo#" xmlns:bar="http://foo.org/ns/bar#"> 
<foo:quz>stuff here</foo:quz> 
<bar:quz>stuff there</bar:quz> 
</sample> 

Il est un peu ennuyeux xmlwriter ne marche pas garder une trace de ces déclarations - il vous permet d'écrire XML non valide. C'est aussi agaçant que l'attribut soit requis, même s'il peut être nul - et que c'est le troisième argument, pas le dernier.

2c, $ * -pike