Вы можете записать пространство имен один раз в нужное место в документе, например в верхнем элементе:
$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);
Это должно закончиться чем-то вроде
<?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>
Раздражающий xmlwriter не отслеживает эти объявления - он позволяет вам писать недопустимый xml. Также раздражает, что атрибут обязателен, даже если он может быть нулевым - и это третий аргумент, а не последний.
$ 2с,
* -Pike