0

simplexml を介して要素に同じ属性を 2 回追加しようとすると、次のエラーが発生します。

Warning: SimpleXMLElement::addAttribute() [function.SimpleXMLElement-addAttribute]: Attribute already exists...

回避策として、次の 3 つの可能性に対して if-else ステートメントを使用しています。

if ($a && $b) {
    $node -> addAttribute("class", "a b");
 }
 else if($a) {
    $node -> addAttribute("class", "a");
 }
 else if ($b) {
    $node -> addAttribute("class", "b");
 }

しかし、それは少しぎこちなく、あまりスケーラブルではありません。誰かが使用しているより良い方法はありますか?

4

1 に答える 1

2

を使用する代わりにSimpleXMLElement::addAttribute、パラメータへの配列アクセスを使用できますか?

たとえば、コードのその部分があると考えると、次のようになります。

$str = <<<XML
<root>
    <elem>glop</elem>
</root>
XML;

$xml = simplexml_load_string($str);
var_dump($xml->elem);

これはこの出力を与えます:

object(SimpleXMLElement)[2]
  string 'glop' (length=4)

この方法で「class=a」属性を追加できます。

$xml->elem['class'] .= 'a ';
var_dump($xml->elem);

これはあなたにこの出力を与えるでしょう:

object(SimpleXMLElement)[5]
  public '@attributes' => 
    array
      'class' => string 'a ' (length=2)
  string 'glop' (length=4)

次に、次のように、その値をクラスの既存の値に連結して、「class=b」属性を追加します。

$xml->elem['class'] .= 'b ';
var_dump($xml->elem);

そして、あなたは得る:

object(SimpleXMLElement)[7]
  public '@attributes' => 
    array
      'class' => string 'a b ' (length=4)
  string 'glop' (length=4)

属性の値の最後のスペースに注意してください; 多分あなたはトリムを使ってこれをきれいにしたいと思うでしょう:

$xml->elem['class'] = trim($xml->elem['class']);
var_dump($xml->elem);

Et voila:

object(SimpleXMLElement)[8]
  public '@attributes' => 
    array
      'class' => string 'a b' (length=3)
  string 'glop' (length=4)

お役に立てれば :-)

于 2009-09-15T04:32:54.537 に答える