1

私は(いくつかの検証の後)フォームを送信し、次のようにいくつかの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>

2 つのシナリオを区別するための if ステートメントがあります。

if ($_POST["operation"] == "UPDATE") {
    //do something
}

ただし、「$sxe」を反復処理してこれらの空のノードを削除する方法がわかりません。

どんな助けでも大歓迎です:)

4

1 に答える 1

1

if(怠惰な感じ)これを行う:

$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

コードはここに書かれ、テストされていません。動作するはずです!

于 2012-10-24T13:20:09.703 に答える