2016-10-31 5 views
0

私は最近XMLWriterに出くわしました。ドキュメントを見て、私はstartElementstartElementNSを見ました。PHPのXMLWriter、startElementではなく、startElementのネームスペースを使用

->startElement('prefix:elementName');(文字列でコロン)

->startElementNS('prefix', 'elementName', null);

私は両方の私のXMLに組み込まれ、私の全体的なXMLはすべての問題を持っていますが、最終的な結果であるしない、次の<prefix:elementName

を受けています同一であるか、私は何かを逃している?

startElementNSを使用しても結果が異なるわけではありませんが、これは優先順位になりますか?

答えて

0

nullは、startElementNS()という名前空間引数の有効な型ではありません。それは文字列でなければなりません。 PHPの動作は少し奇妙です。エラーとして報告するか、空の文字列にキャストします。最初のバージョンは、名前空間の定義が含まれて

<?xml version="1.0" encoding="UTF-8"?> 
<prefix:elementName/> 

:中startElement()結果とバリアント間

<?xml version="1.0" encoding="UTF-8"?> 
<prefix:elementName xmlns:prefix=""/> 

$writer = new XMLWriter; 
$writer->openURI('php://output'); 
$writer->startDocument('1.0', 'UTF-8'); 
$writer->startElementNS('prefix', 'elementName', ''); 
$writer->endElement(); 
$writer->endDocument(); 

出力:あなたは空の文字列を提供する場合、あなたは違いが表示されます使用された接頭辞。名前空間を認識するメソッドは、必要に応じて名前空間の定義を追加します。 XMLパーサが名前空間を認識している場合、第2のバージョンは無効なXMLになります。

名前空間を使用する場合は、名前空間を認識する方法を使用してください。

元々、XMLには名前空間がなく、タグ名には ':'が許可された文字でした。この定義には多くの文字が含まれています。だから、古いパーサーJavaはまだ名前空間を無視してXMLをそのようにパースするモードを持っています。 MySQLのような他のものはネームスペースを実装しませんでした。一方、PHP(libxml)は常にネームスペースを認識します。名前空間を認識しないメソッドの振る舞いを変更しなかったため、ノード名を使用する場合は、コロンでノード名を追加できます。文字列関数のみを使用して同じことを実行できるように、名前空間を属性として使用して有効なXML文字列を生成することも可能です(名前空間を属性として追加する)。

+0

XMLパーサーに関する情報をありがとう。しかし、次のものが追加されれば#2の結果は同一になるでしょうか? - > startAttribute( 'xmlns:接頭辞'); \t \t - > text( ''); \t \t - > endAttribute(); – Darwin

+0

「空の」名前空間に名前空間または名前空間プレフィックスを使用する場合は、名前空間対応の方法を再度使用します。私は歴史についての段落を追加します。 – ThW

+0

私はあなたが私の質問に答えたと信じています。可能ですが、それらを追加する正しい方法ではないので、終わりには名前空間を認識するメソッドを使用してください。ありがとうThW。 – Darwin

関連する問題