使用XMLWriter跟踪名称空间声明

时间:2009-06-15 17:31:05

标签: php xml namespaces xmlwriter

我正在开发一个XML Web服务(在PHP中!),为了做正确的事情,我想使用XMLWriter而不是简单地连接字符串并希望最好。

我正在使用 - > startElementNS和 - > writeElementNS在任何地方使用XML命名空间。问题是每次我使用这些函数时,新的命名空间声明也在写。

虽然这是正确的语法,但它有点不需要。我想确保我的命名空间声明只在第一次在文档的上下文中使用时编写。

使用XMLWriter是否有一种简单的方法可以解决这个问题,或者我是否将其子类化并手动管理。

谢谢, 埃弗特

2 个答案:

答案 0 :(得分: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>

答案 1 :(得分:6)

您可以在文档中的所需位置写出命名空间一次,例如:在顶部元素中:

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

$ 2C, * -pike