在php中创建具有空值的XML节点

Avi*_*ash 6 php xml null nodes

我正在使用php创建一个xml文件.生成的XML是.

<xml>
  <data>
    <firstname>Peter</firstname>
    <insertion>V</insertion>
    <lastname>John</lastname>
    <gender>Male</gender>
  </data>
</xml>
Run Code Online (Sandbox Code Playgroud)

但是如果值为null,则生成的xml是(查看节点插入).

<xml>
  <data>
    <firstname>Peter</firstname>
    <insertion/>
    <lastname>John</lastname>
    <gender>Male</gender>
  </data>
</xml>
Run Code Online (Sandbox Code Playgroud)

如果值为null,我希望创建xml以使其生成.

<xml>
  <data>
    <firstname>Peter</firstname>
    <insertion></insertion>
    <lastname>John</lastname>
    <gender>Male</gender>
  </data>
</xml>
Run Code Online (Sandbox Code Playgroud)

这是我的代码.

    $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");
Run Code Online (Sandbox Code Playgroud)

我在创建它之后将此xml作为响应发送.因此,在客户端的姓氏节点正成为一个子节点插入 时,它是

  <insertion/>
Run Code Online (Sandbox Code Playgroud)

Gor*_*onM 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));
Run Code Online (Sandbox Code Playgroud)

但老实说,如果用于处理 XML 的解析器没有错误,我认为这样做没有什么意义。