0

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

<Bars>
    <Bar>
        <bar_id>0</bar_id>
        <Bartenders>
            <Bartender>
                <imageURL>unique URL</imageURL>
                <shift>20:30</shift>
            </Bartender>
        </Bartenders>
    </Bar>
    <Bar>
        <bar_id>1</bar_id>
        <Bartenders>
               <Bartender>
                      <imageURL>aURL</imageURL>
                      <shift>a shift</shift>
                </Bartender>
                <Bartender>
                          <imageURL>aURL</imageURL>
                          <shift>a shift</shift>
                </Bartender>
        </Bartenders>
    </Bar>

たとえば、一意の imageURL に基づいてユーザーを削除したいのですが、bar_id もわかります。これは私がこれまでに持っている php ですが、別の方法でそれを行うための提案を完全に受け入れています

    $newimageURL = $row['imageURL'];
    $newBar_ID = $row['Bar_ID'];

    $xmlUrl = "Bars.xml"; // XML 
    $xmlStr = file_get_contents($xmlUrl);
    $xml = new SimpleXMLElement($xmlStr);
    $bartenders = $xml->xpath('//Bartenders');

         // something needs to happen here to remove the child

    $xml->asXML('Bars.xml');

この種のものを使用できると言われました:

$bartenders->removeChild($bartenders[$newBar_ID]);

またはxpathですが、一意のimageXMLだけで正しいバーテンダーへのパスを取得する方法がわかりません。これをもっとうまく計画/設計するべきだったことはわかっていますが、時間に追われており、これを行う必要があります。

申し訳ありませんが、私はphpが苦手です...助けてくれてありがとう。

4

1 に答える 1

1

http://php.net/manual/fr/ref.simplexml.phpには、完全に正常に動作する非常に優れたスクリプトがあります。

function removeNode($xml, $path, $multi='one')
{
   $result = $xml->xpath($path);

      # for wrong $path
      if (!isset($result[0])) return false;

      switch ($multi) {
          case 'all':
                $errlevel = error_reporting(E_ALL & ~E_WARNING);
                foreach ($result as $r) unset ($r[0]);
                error_reporting($errlevel);
                return true;

            case 'child':
               unset($result[0][0]);
               return true;

            case 'one':
               if (count($result[0]->children())==0 && count($result)==1) {
                   unset($result[0][0]);
                   return true;
               }

            default:
                  return false;             
      }

}

詳細については、リンクをクリックしてください。

于 2012-04-12T01:58:07.243 に答える