6

PHPを使用してxmlファイルを作成しています。結果の XML は .

<xml>
  <data>
    <firstname>Peter</firstname>
    <insertion>V</insertion>
    <lastname>John</lastname>
    <gender>Male</gender>
  </data>
</xml>

ただし、値が null の場合、結果の xml は次のようになります (ノードの挿入を見てください)。

<xml>
  <data>
    <firstname>Peter</firstname>
    <insertion/>
    <lastname>John</lastname>
    <gender>Male</gender>
  </data>
</xml>

値がnullの場合、結果が得られるようにxmlを作成したいと思います。

<xml>
  <data>
    <firstname>Peter</firstname>
    <insertion></insertion>
    <lastname>John</lastname>
    <gender>Male</gender>
  </data>
</xml>

これは私のコードです。

    $doc = new DOMDocument('1.0');
    $doc->formatOutput = true;
    $root = $doc->createElement('data');
    $doc->appendChild($root);
    $data = $doc->createElement('data');
    $fname = $doc->createElement('firstname');
        $fname->appendChild(
                $doc->createTextNode($row['firstname']));
        $data->appendChild($fname);

        $ins = $doc->createElement('insertion');
        $ins->appendChild(
                $doc->createTextNode($row['insertion']));
        $data->appendChild($ins);

        $lname = $doc->createElement('lastname');
        $lname->appendChild(
                $doc->createTextNode($row['lastname']));
        $data->appendChild($lname);

        $gender = $doc->createElement('gender');
        $gender->appendChild(
                $doc->createTextNode($row['gender']));
        $data->appendChild($gender);
       $root->appendChild($data);
 $doc->save($path . "test.xml");

このxmlを作成後、レスポンスとして送信しています。したがって、クライアント側では、lastnameノードが挿入のサブノードになっ ています。

  <insertion/>
4

1 に答える 1

0

デフォルトで出力されているものは「省略形」と呼ばれます。これは完全に有効な XML であり、適切に実装された XML パーサーであれば問題なく処理できるはずです。「ロングハンド」出力を強制する理由として考えられる唯一の理由は、出力された XML を、バグが多く、ショートハンドのケースを処理できないパーサーにフィードする必要がある場合です。問題のあるパーサーを機能するパーサーに置き換えることができる場合は、代わりにそれを行うことをお勧めします。

非短縮バージョンを絶対に出力する必要がある場合は、DOMDocument::SaveXML() および DOMDocument::save() メソッドを使用して出力を構成できます。出力を簡略表記ではなく冗長にするフラグを設定できます。ただし、PHPマニュアルには十分に文書化されていません。次のコードは、それがどのように機能するかを示しています。

$dom = new DOMDocument ();
$dom -> loadXML ('<root><foo>foo</foo><bar></bar><baz>baz</baz></root>');

var_dump ($dom -> saveXML ());
var_dump ($dom -> saveXML ($dom, LIBXML_NOEMPTYTAG));

正直なところ、XML を処理するパーサーにバグがなければ、これを行う意味はあまりないと思います。

于 2012-12-26T10:29:48.043 に答える