Несколько значений в одном атрибуте (например, классе) в simplexml (с использованием PHP) - PullRequest
0 голосов
/ 15 сентября 2009

Если я пытаюсь добавить один и тот же атрибут дважды в элемент через simplexml, я получаю следующую ошибку:

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

В качестве обходного пути я использую операторы if-else для трех возможностей:

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

Но это кажется немного неуклюжим и не очень масштабируемым. Есть ли лучший способ, которым кто-либо пользуется?

1 Ответ

2 голосов
/ 15 сентября 2009

Вместо использования 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", объединив это значение с существующим значением class, следующим образом:

$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)

Надеюсь, это поможет: -)

...