2009-06-15 91 views
2

我正在使用XML webservice(使用PHP!),为了做正确的事情,我想使用XMLWriter而不是只是简化字符串,并希望获得最好的结果。使用XMLWriter跟踪名称空间声明

我正在使用XML命名空间到处使用 - > startElementNS和 - > writeElementNS。问题在于,每次我使用这些函数时,新的名称空间声明也在写入。

虽然这是正确的语法,但它有点不必要。我想确保我的名称空间声明仅在首次用于文档上下文时编写。

有没有一种简单的方法来解决这个XMLWriter,或者我坚持子类化和手动管理这个。

感谢, 埃弗特

回答

6

可以传递NULL作为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();
打印
<foo:bar xmlns:foo="http://whatever/foo"> 
<foo:baz/> 
</foo:bar>

+0

不正是我要找的。在你的例子中,'bar'和'baz'元素可以通过完全不同的对象和方法来实现,这些对象和方法并不总是彼此相互认识。 I __always__想要指定命名空间,但我希望它只渲染第一次。 – Evert 2009-06-16 00:51:31

6

您可以在文档f.e中的所需位置写出一次名称空间。在顶部元件:

$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。这也是令人讨厌的属性是必需的,即使它可以为空 - 并且它是第三个参数,而不是最后一个。

$ 2C, * -pike

相关问题