13

我想使用 php simplexml 生成 xml。

$xml = new SimpleXMLElement('<xml/>');

$output = $xml->addChild('child1');
$output->addChild('child2', "value");
$output->addChild('noValue', '');

Header('Content-type: text/xml');
print($xml->asXML());

输出是

<xml>
   <child1>
      <child2>value</child2>
      <noValue/>
   </child1>
</xml>

我想要的是如果标签没有价值,它应该像这样显示

<noValue></noValue>

我试过在 SimpleXML for PHP 中使用LIBXML_NOEMPTYTAGfrom Turn OFF self-closing tags?

我试过$xml = new SimpleXMLElement('<xml/>', LIBXML_NOEMPTYTAG);了,它不起作用。所以不知道放哪里LIBXML_NOEMPTYTAG

4

5 回答 5

22

LIBXML_NOEMPTYTAG根据规范,不适用于 simplexml :

此选项目前仅在 DOMDocument::save 和 DOMDocument::saveXML 函数中可用。

要实现您所追求的,您需要将 simplexml 对象转换为 DOMDocument 对象:

$xml = new SimpleXMLElement('<xml/>');
$child1 = $xml->addChild('child1');
$child1->addChild('child2', "value");
$child1->addChild('noValue', '');
$dom_sxe = dom_import_simplexml($xml);  // Returns a DomElement object

$dom_output = new DOMDocument('1.0');
$dom_output->formatOutput = true;
$dom_sxe = $dom_output->importNode($dom_sxe, true);
$dom_sxe = $dom_output->appendChild($dom_sxe);

echo $dom_output->saveXML($dom_output, LIBXML_NOEMPTYTAG);

返回:

<?xml version="1.0" encoding="UTF-8"?>
<xml>
  <child1>
    <child2>value</child2>
    <noValue></noValue>
  </child1>
</xml>

值得指出的一点...... NOEMPTYTAG 选项可用于 DOMDocument 而不是 simplexml 的可能原因是空元素不被视为有效的 XML,而 DOM 规范允许它们。您正在用头撞墙以获得无效的 XML,这可能表明有效的自闭合空元素也可以正常工作。

于 2013-10-28T09:03:52.883 回答
8

尽管已经给出了相当长的答案——这些答案并不是特别错误,并且确实为一些 libxml 库内部和它的 PHP 绑定提供了一些启示——你最有可能在寻找:

$output->noValue = '';

添加一个开放标签,空节点值和结束标签(美化,演示在这里:http: //3v4l.org/S2PKc):

<?xml version="1.0"?>
<xml>
  <child1>
    <child2>value</child2>
    <noValue></noValue>
  </child1>
</xml>

只是注意到它似乎被现有的答案所忽视。

于 2013-10-30T08:28:12.390 回答
1

由于 Simple XML 被证明很麻烦,也许 XMLWriter 可以做你想做的事。

这是一个小提琴

<?php

$oXMLWriter = new XMLWriter;
$oXMLWriter->openMemory();
$oXMLWriter->startDocument('1.0', 'UTF-8');

$oXMLWriter->startElement('xml');
$oXMLWriter->writeElement('child1', 'Hello world!!');
$oXMLWriter->writeElement('noValue', '');
$oXMLWriter->endElement();

$oXMLWriter->endDocument();
echo htmlentities($oXMLWriter->outputMemory(TRUE));

?>

输出:

<?xml version="1.0" encoding="UTF-8"?>
  <xml>
    <child1>Hello world!!</child1>
    <noValue></noValue>
  </xml>
于 2013-10-28T08:35:03.703 回答
0

扩展我的评论(有些被删除):

行为取决于您的环境。相同的代码:

$xml = new SimpleXMLElement('<xml/>', LIBXML_NOEMPTYTAG);

$output = $xml->addChild('child1');
$output->addChild('child2', "value");
$output->addChild('noValue', '');

echo $xml->asXML();

3v4l.orgIdeone.com中,它产生自闭合标签;
eval.incodepad.org和我的本地主机(PHP 5.3/5.4、libXML 2.7、Windows)中,它会产生空标签。

由于根据PHP 文档LIBXML_NOEMPTYTAG只有(保证)在 中工作DOM,您可能想尝试DOM确保:

$dom=new DOMDocument("1.0","UTF-8");
$dom->formatOutput=true;
$root=$dom->createElement("xml");
$dom->appendChild($root);
$child1=$dom->createElement("child1");
$root->appendChild($child1);
$node=$dom->createElement("child2");
$node->appendChild($dom->createTextNode("value"));
$child1->appendChild($node);
$node=$dom->createElement("noValue");
$child1->appendChild($node);
echo $dom->saveXML($dom,LIBXML_NOEMPTYTAG);

3v4l.org 演示

编辑

以上所有在线演示站点均Content-Type: text/plain默认使用。如果要直接将 XML 作为独立资源输出到浏览器,可以在输出前指定标头:

header("Content-Type: text/xml");
echo $dom->saveXML($dom,LIBXML_NOEMPTYTAG);
于 2013-10-28T09:31:12.050 回答
0

我必须获取子节点并为 nodeValue 属性分配一个空字符串,然后出现 xml 关闭标记。

$output->childNodes[1]->nodeValue = '';

问候。

于 2020-08-15T18:24:59.533 回答