我提交了一个表单(经过一些验证)并编译了一些xml,如下所示:
$sxe = new SimpleXMLElement($xmlstr);
$MyFirstNode = $sxe->addChild('MyFirstNode', $_POST["MyTitle"]);
$MySecondNode = $sxe->addChild('MySecondNode');
$MyTHIRDNode = $MySecondNode->addChild('MyTHIRDNode', $_POST["FormElementName"]);
在此之后,我使用以下代码将xml写入文档;
$myFile = "myfilename.xml";
$fh = fopen($myFile, 'w') or die("can't open file");
fwrite($fh, $sxe->asXML());
fclose($fh);
在一个场景中,我需要生成包含任何空节点的XML。所以在上面的示例中,如果FormElementName
为空,那就没问题了(产生类似<MyTHIRDNode></MyTHIRDNode>
但是,在另一种情况下,我需要删除所有这些空节点,所以我留下了那些包含某种数据的节点:
<node>
<one>Hello</one>
<two></two> // <- Empty
<three>World!</three>
</node>
// Becomes...
<node>
<one>Hello</one>
<three>World!</three>
</node>
我有一个if语句,可以区分这两种情况:
if ($_POST["operation"] == "UPDATE") {
//do something
}
但是,我不知道如何遍历我的'$ sxe'并删除这些空节点。
非常感谢任何帮助:)
答案 0 :(得分:1)
如果(感觉懒惰)这样做:
$xmlsz = $xml->asXML(); // Get XML code from your SXE
// Keep retrying as some empty nodes may contain other empty nodes
while(true){
$xmlsz_ref = $xmlsz; // keep old version as reference
// Remove <node></node> empty nodes
$xmlsz = preg_replace('~<[^\\s>]+>\\s*</\\1>~si', null, $xmlsz);
// Remove <node /> empty nodes
$xmlsz = preg_replace('~<[^\\s>]+\\s*/>~si', null, $xmlsz);
if($xmlsz_ref === $xmlsz) break; // If not changed, break!
}
$xmlsz = simplexml_load_string($xmlsz); // reparse XML code to your SEX
代码写在这里,未经过测试。应该可以工作!