3

私は(PHPで!)XML Webサービスに取り組んでおり、「正しく」実行するために、文字列を連結して最高のものを期待するのではなく、XMLWriterを使用したいと考えています。

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

これは正しい構文ですが、少し不必要です。名前空間宣言は、ドキュメントのコンテキストで初めて使用されるときにのみ記述されるようにしたいと思います。

XMLWriterを使用してこれを実行する簡単な方法はありますか、それともこれをサブクラス化して手動で管理することに固執していますか?

ありがとう、エバート

4

2 に答える 2

7

ドキュメント内の目的の場所に名前空間を1回書き出すことができます。これは、一番上の要素の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になる可能性がある場合でも、属性が必要であり、最後ではなく3番目の引数であることが煩わしいです。

$ 2c、*-パイク

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

于 2009-06-15T19:19:40.210 に答える