Eve*_*ert 2 php xml xmlwriter namespaces
我正在开发一个XML Web服务(在PHP中!),为了做正确的事情,我想使用XMLWriter而不是简单地连接字符串并希望最好.
我正在使用 - > startElementNS和 - > writeElementNS在各处使用XML命名空间.问题是,每次我使用这些函数时,新的命名空间声明也在写入.
虽然这是正确的语法,但它有点不需要.我想确保我的命名空间声明只在第一次在文档的上下文中使用时编写.
有没有一种简单的方法可以使用XMLWriter来解决这个问题,或者我是否将其子类化并手动管理它.
谢谢,埃弗特
您可以传递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();Run Code Online (Sandbox Code Playgroud)版画<foo:bar xmlns:foo="http://whatever/foo"> <foo:baz/> </foo:bar>
您可以在文档中的所需位置写出命名空间一次,顶部元素为fe:
$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);
Run Code Online (Sandbox Code Playgroud)
这最终应该是这样的
<?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>
Run Code Online (Sandbox Code Playgroud)
有点烦人的xmlwriter没有跟踪那些声明 - 它允许你写无效的xml.这也是烦人的属性是必需的,即使它可以为null - 并且它是第三个参数,而不是最后一个.
$ 2c,*-pike