繁体   English   中英

如何在PHP中从XML删除空节点

[英]How to remove empty nodes from XML in PHP

我正在提交表单(经过一些验证)并像这样编译一些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”并删除这些空节点。

任何帮助深表感谢 :)

如果(感到懒惰)这样做:

$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

代码是在这里编写的,未经测试。 应该管用!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM