XMLWriterを使用した名前空間宣言を追跡します
-
13-09-2019 - |
質問
私はXML Webサービス(PHP!)に取り組んでいます。「正しい」ことをするために、文字列を一致させて最高のものを期待するのではなく、XMLWriterを使用したいと思います。
XML名前空間をどこでも使用しています - > startelementnsおよび - > writeElementnsを使用しています。問題は、これらの機能を使用するたびに、新しい名前空間宣言も書いていることです。
これは正しい構文ですが、少し不要です。名前空間宣言が、ドキュメントのコンテキストで初めて使用されるときにのみ書かれていることを確認したいと思います。
XMLWriterでこれを簡単に進める方法はありますか、それともこれをサブクラス化して手動で管理していますか?
ありがとう、エバート
解決
nullをURIパラメーターとして渡すことができます。
<?php
$w = new XMLWriter;
$w->openMemory();
$w->setIndent(true);
$w->startElementNS('foo', 'bar', 'http://何でも/foo');
$w->startElementNS('foo', 'baz', null);
$w->endElement();
$w->endElement();
echo $w->outputMemory();
プリント<foo:bar xmlns:foo="http://whatever/foo"> <foo:baz/> </foo:bar>
他のヒント
ドキュメント内の目的の場所に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、 *-pike
所属していません StackOverflow