1

xmlドキュメントを解析するiOSアプリを作成しました。ユーザーがログインすると、ユーザーの情報がxmlファイルに追加されます。ユーザーがログアウトしている場合やログインをキャンセルしている場合は、ユーザーを削除できるようにしたいと思います。基本的に、次のようなxmlオブジェクト(この場合はユーザー)を削除する方法を理解する必要があります。

<users>
    <user>
        <fname>fname1</fname>
        <lname>lname1</lname>
    </user>
    <user>
        <fname>fname2</fname>
        <lname>lname2</lname>
    </user>
</users>

たとえば、私の場合は常に一意である姓に基づいてユーザーを削除したい場合があります...これは私がこれまでに持っているphpですが、別の方法でそれを行うための提案を完全に受け入れています

$deletefname = $row['fname'];
$deletelname = $row['lname'];
$deleteimageurl = $row['imageURL'];

$xmlUrl = "thefile.xml"; // XML 
$xmlStr = file_get_contents($xmlUrl);
$xml = new SimpleXMLElement($xmlStr);
foreach($xml->users as $user)
{
    if($user[$fname] == $deletefname) {
        $xml=dom_import_simplexml($user);
        $xml->parentNode->removeChild($xml);    
    }
}


$xml->asXML('newfile.xml');
echo $xml;

私はphpが非常に苦手で、このコードを他の誰かから取得しました。それがどのように機能するかは100%わかりません。

ご協力いただきありがとうございます。

4

2 に答える 2

1

始める前に、XML ファイルはデータベースではなく、実際のデータベース (mysql、sqlite、xml データベース) を使用するか、少なくともファイル ロック ( flock()) またはアトミック書き込み (一時ファイルへの書き込み)を行う必要があるという通常の警告を出しますその後rename()、本名に)。そうしないと、あるリクエストがファイルを読み込んでいて、別のリクエストがファイルに書き込んでいるという状況に陥り、不要な XML が取得されます。

これはSimpleXMLまたは を使用して行うことができDOMDocument、どちらでも xpath または反復を使用できます。

以下は、SimpleXMLElementコードが使用するメソッドであるためです。

$sxe = simplexml_load_string($xmlstring);
// XPATH
$matches = $sxe->xpath('/users/user[lname="lname2"]');
foreach ($matches as $match) {
    unset($match[0]);
}
// Iteration--slower, but safer if a part of the path is dynamic (e.g. "lname2")
// because xpath literals are very hard to escape.
// be sure to iterate backwards
for ($i=$sxe->user->count()-1; $i >= 0; --$i) {
    if ($sxe->user[$i]->lname=='lname2') {
        unset($sxe->user[$i]);
    }
}

echo $sxe->asXML();
于 2012-04-11T21:16:39.367 に答える
1
<?php 
/*
 * @source_file -- source to your xml document
 * @node_to_remove -- your node
 * Note this will remove an entire user from the source file if the argument (node_to_remove)
   matches a nodes node value
 *
 */
function newFunction($source_file,$node_to_remove) {
    $xml = new DOMDocument();
    $xml->load($source_file);
    $xml->preserveWhiteSpace = false;
    $xml->formatOutput = true; 
    foreach ($xml->getElementsByTagName('users') as $users ) 
    {
        foreach($users->getElementsByTagName('user') as $user) {

            $first_name = $user->getElementsByTagName('fname')->item(0);

            if($first_name->nodeValue == $node_to_remove) {


                $users->removeChild($users->getElementsByTagName('user')->item(0));

            }

        }

    }

    $result = $xml->saveXML();

    return $result;

}


echo newFunction('xml.xml','lname1');
?>
于 2012-04-11T20:27:18.977 に答える