3

我正在开发一个 XML 网络服务(在 PHP 中!),为了做“正确”的事情,我想使用 XMLWriter 而不是仅仅连接字符串并希望获得最好的结果。

我使用->startElementNS 和->writeElementNS 到处使用XML 命名空间。问题是,每次我使用这些函数时,都会编写一个新的命名空间声明。

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

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

谢谢, 埃弗特

4

2 回答 2

7

您可以在文档中的所需位置写出命名空间一次,在顶部元素中写出 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);

这应该最终像

<?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, *-派克

于 2011-09-26T12:50:07.137 回答
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>

于 2009-06-15T19:19:40.210 回答