2009-06-15 80 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

相關問題