Pregunta

Si intento agregar el mismo atributo dos veces a un elemento mediante simplexml, aparece el siguiente error:

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

Como solución alternativa, estoy usando declaraciones if-else para las tres posibilidades:

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

Pero eso se siente un poco torpe y poco escalable. ¿Hay una mejor manera que alguien esté usando?

¿Fue útil?

Solución

En lugar de usar SimpleXMLElement :: addAttribute , ¿tal vez solo puede usar el acceso de matriz a los parámetros?

Por ejemplo, considerando que tiene esa porción de código:

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

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

Lo que da este resultado:

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

Puede agregar " class = a " atribuir de esta manera:

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

Que le dará esta salida:

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

Y, luego, agregue la " class = b " atributo al concatenar ese valor con el valor existente de la clase, de esta manera:

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

Y obtienes:

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

Tenga en cuenta el espacio al final del valor del atributo; tal vez quieras limpiar esto, usando trim:

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

Espero que esto ayude :-)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top