Múltiples valores en un atributo (como clase) en simplexml (usando PHP)
-
07-07-2019 - |
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?
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 :-)