2012-09-14 22 views
5

Tengo el siguiente documento XML aquí: Editar: (ver más abajo para la muestra)atributos php SimpleXML están desaparecidos

Estoy utilizando php/SimpleXML para convertirlo en un objeto para leerla:

$xmlContent = file_get_contents($path . '/test.xml'); 
$tablesRaw = new SimpleXMLElement($xmlContent); 
echo '<pre>'; 
print_r($tablesRaw); 
echo '</pre>'; 

Cuando imprimo_r veo atributos para el campo pero los atributos para valor aceptable no se muestran. Este es un ejemplo del XML sin procesar (necesito el atributo value):

<acceptable-value value="0"> 
    Unknown 
</acceptable-value> 

Esto es lo que veo cuando print_r:

[acceptable-values] => SimpleXMLElement Object 
              (
               [acceptable-value] => Array 
                (
                 [0] => 
        Unknown 

                 [1] => 
        Invalid 

                 [2] => 
        Deleted 

                 [3] => 
        Valid/Good 

                 [4] => 
        Inactive 

                ) 

              ) 

Alguna pista por eso que los atributos no se publican? Gracias por adelantado.

EDITAR: solicitud de algunos de los xml:

<field name="Address1Type" type="String"/> 
<field name="Address2Street1" type="String"/> 
<field name="Address2Street2" type="String"/> 
<field name="Address2Type" type="String"/> 
<field name="Address3Street1" type="String"/> 
<field name="Status" type="Integer" access="R"> 
      <acceptable-values> 
       <acceptable-value value="0"> 
        Unknown 
       </acceptable-value> 
       <acceptable-value value="1"> 
        Invalid 
       </acceptable-value> 
       <acceptable-value value="2"> 
        Deleted 
       </acceptable-value> 
       <acceptable-value value="3"> 
        Valid/Good 
       </acceptable-value> 
       <acceptable-value value="4"> 
        Inactive 
       </acceptable-value> 
      </acceptable-values> 
     </field> 
+0

¿Copiará/pegará algo del código xml original, para que yo no tenga que descargarlo? – Norse

+0

sí, tratando de mostrar algo para mostrar – joshmmo

+1

allí vamos a mostrar ahora – joshmmo

Respuesta

7

La respuesta simple aquí no es usar print_r() con objetos SimpleXML. Debido a que son envoltorios alrededor de datos que no son PHP, las funciones como las que normalmente mostrarían el objeto "completo" no reflejan realmente lo que estás viendo.

La forma de acceder a un atributo con SimpleXML es usar el nombre del atributo como si fuera una clave de matriz ($node['attribute']); esto hace no significa que hay una matriz en alguna parte con esa clave, es una llamada de función en el disfraz.

Si desea obtener una idea de los nodos que está buscando al escribir el código SimpleXML, consulte this simplexml_dump() function que escribí (comentarios bienvenidos).

+0

No estoy seguro si estoy haciendo algo mal pero parece que no funciona, puede ver mi código/salida aquí http://i46.tinypic.com/wnqti.jpg – joshmmo

+0

@joshmmo Disculpas, tiendo a correr PHP con avisos suprimidos, ya que a menudo se quejan de cosas con las que estoy contento. Actualizaré la función para no generar ese Aviso la próxima vez que inicie sesión en mi cuadro dev. Sin embargo, el resultado es el esperado, no intenta recurrir a través de toda la estructura, solo le dice que el nodo actual se llama 'tablas' y contiene 57 niños llamados 'tabla'.'simplexml_dump ($ tablesRaw-> children())' muestra algo más útil, o de hecho 'simplexml_dump ($ tablesRaw-> table [22] -> fields-> field [31] -> {'acceptable-values'} -> children()) ' – IMSoP

+0

muy agradable Me gusta. Sería bueno también si pudiera expandir todo el objeto por así decirlo para poder verlo todo de una vez. – joshmmo

0

En primer lugar, usted tiene que conseguir el objeto SimpleXMLElement. En este caso:

$xmlContent = file_get_contents($path . '/test.xml'); 
$tablesRaw = new SimpleXMLElement($xmlContent); 
$elements = $tablesRaw->table[22]->fields->field[31]->{'acceptable-values'}->children(); 

Ahora, se puede iterar sobre cada objeto acceptable-value y utilizar el attributes() método:

foreach($elements as $element) { 
    echo $element->attributes()->value . " "; 
    echo trim($element[0]) . "\n"; 
} 

Con el XML, que imprimirá:

0 Unknown 
1 Invalid 
2 Deleted 
3 Valid/Good 
4 Inactive 

Doesn Confíe en el índice de matriz, porque la llamada a attributes() obtiene los atributos reales del elemento. Y ->value obtiene el atributo con el nombre "valor".

Cuestiones relacionadas