2009-06-15 14 views
2

私はXML Webサービス(PHPで!)で作業していますが、「正しい」ことをするために、単に文字列をコンカチネートするのではなく、ベストを狙ってXMLWriterを使いたいと思います。XMLWriterでネームスペース宣言をトラッキングする

私はどこでも - > startElementNSと - > writeElementNSを使ってXML名前空間を使用しています。問題は、これらの関数を使うたびに新しい名前空間宣言が書かれていることです。

これは正しい構文ですが、少し不必要です。私の名前空間宣言は、ドキュメントの文脈で初めて使用されるときにのみ書かれていることを確認したいと思います。

XMLWriterでこれを簡単に実行する方法はありますか、それをサブクラス化して手動で管理しています。

おかげで、 エバート

答えて

6

あなたはuriパラメータとしてNULLを渡すことができます。

<?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'要素は完全に異なるオブジェクトとメソッドで実装されているかもしれませんが、お互いを常に意識しているわけではありません。 私は__always__ネームスペースを指定したいが、初めて。 – Evert

+0

私はphp/xmlwriterまたはlibxml/xmlwriterでこれをサポートしていません。あなたはおそらくこれを自分自身で把握しなければなりません。 – VolkerK

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 doesntのあるこれらの宣言を追跡する - それはあなたが無効なXMLを書くことができます。また、属性が必要な場合でも、nullにすることもできますが、最後の属性ではなく3番目の引数を迷惑にします。 $図2c

、* -pike

関連する問題