0

私は初めてなsimplexmlので、いくつかの用語が混同されている場合はご容赦ください:)

次のxmlファイルを次の場所に保存していますjs/data.xml::

<users>
  <user>
    <id>2011</id>
    <posX>12</posX>
    <posY>29</posY>
    <title>Senior Developer</title>
  </user>
  <user>
    <id>2022</id>
    <posX>45</posX>
    <posY>87</posY>
    <title>Test22 text</title>
  </user>
</users>

ユーザーを追加するための作業コードを含むphpファイルがあります。

$xml = simplexml_load_file("js/data.xml");
    $user = $xml->addChild('user');
    $user->addChild('id',2022);
    $user->addChild('posX',34);
    $user->addChild('posY',67);
    $user->addChild('title','Test33 text');
    // Store new XML code in data.xml
    $xml->asXML("js/data.xml");
    echo $xml->asXML();

これにより、新しいユーザーがファイルに追加されます。これまでのところ、問題はありません。

コードをよく見ると、追加しようとしているこの新しいユーザーが xml ファイル内のユーザーと同じ ID (2022) を持っていることがわかります。これは同じ人物なので、この場合は追加せずに更新します。ここから問題が始まります。

彼を更新するには、まず ID が存在するかどうかを確認する必要があります。私はいくつかのグーグルを行い、このサイトを検索し、ここに示されている解決策を見つけまし:

これは私のphpファイルの変更されたコードです:

$xml = simplexml_load_file("js/data.xml");

//from: https://stackoverflow.com/questions/1560827/php-simplexml-check-if-a-child-exist
if (isset($xml->user->id->2022)) { // c exists
   echo "test";
} else { //else add it
   $user = $xml->addChild('user');
   $user->addChild('id',2022);
   $user->addChild('posX',45);
   $user->addChild('posY',87);
   $user->addChild('title','Test33 text');
}
// Store new XML code in data.xml
$xml->asXML("js/data.xml");
echo $xml->asXML();

ここで、IDが存在するかどうかを確認しようとします。もしそうなら:echo何か、そうでなければその人を追加してください。残念ながら、このコードを実行すると、次のエラーが発生します。

Parse error: syntax error, unexpected T_LNUMBER, expecting T_STRING or T_VARIABLE or '{' or '$' 

ここで私が間違っていることを知っている人はいますか?

posX私が抱えている2番目の問題は、存在する場合は子( 、posYおよびtitle)を更新することですid(もちろん、このIDでグループ化された子のみ)。コードのその部分は、テスト エコーが現在ある場所である必要があります。このサイトまたは Google で simplexml を使用して有効なソリューションを見つけることができませんでした。これを行う方法を知っている人はいますか?

お時間をいただきありがとうございます

4

2 に答える 2

1
Parse error: syntax error, unexpected T_LNUMBER, expecting T_STRING or T_VARIABLE or '{' or '$' 

ここで私が間違っていることを知っている人はいますか?

これは非常に簡単に答えられます。エラー メッセージの主な部分は「構文エラー、予期しない T_LNUMBER」です。

解析エラーは、PHP が作成したコードを理解できなかったことを意味します。これは通常、タイプミス (コンピューターの構文エラー)の兆候です。次に、PHP はエラーの内容を通知します。unexpected T_LNUMBER of whichはlong numberT_LNUMBERのトークン名であり、long as in integer であり、特に long as in way ではありません。

// from: https://stackoverflow.com/questions/1560827/php-simplexml-check-if-a-child-exist
if (isset($xml->user->id->2022)) 
                          ^^^^

それがこの数字です。PHP でフィールドにアクセスするには、その場所の AZ または az の範囲の文字で始まる必要があります。そこにある 0-9 のような別の範囲の文字ではありません。

おそらく、一度に2つのことをしたいので、そこにある既存の回答からコードをコピーするのが速すぎました。

$idExists = isset($xml->user->id);
$idIs2022 = $idExists && trim($xml->user->id) == 2022;

コードの最初の行には、 SimpleXMLElementで解析された XML に、 idという名前の子要素を含む$xml最初のユーザー要素があるかどうかの結果が格納されます。ユーザー要素がまったくない場合でも失敗します。

2 行目は、その要素のトリミングされたテキスト値を 2022 の整数値と比較します。

これはまだエラーが発生しやすく、少し面倒なので、ここではmichi が提案するように XPath を使用する方がエレガントです。

于 2014-12-19T15:24:22.923 に答える
1

代わりにbyxpath()を選択するために使用します:<user><id>

$xml = simplexml_load_string($x); // assume XML in $x

$id         = "2022";
list($user) = $xml->xpath("/users/user[id = '$id']") + [NULL];

今すぐチェックしてください$user。XML に上記の ID がある場合$user、要素が含まれSimpleXMLます。
そうでない場合は、$userになりますNULL

if (!$user) {
    // create new user
} else  {
    $user->title = "updated!";
}

3 行目の最後の には PHP >= 5.4 が必要であることに注意してください。お[NULL]持ちでない場合は、次を使用してください。

list($user) = $xml->xpath("/users/user[id = '$id']") + array(NULL);

動作を確認してください: https://eval.in/236618

于 2014-12-18T23:49:55.947 に答える