2012-09-14 17 views
5

Ho il seguente documento XML qui: Edit: (vedi sotto per il campione)attributi php SimpleXML mancano

Sto usando php/SimpleXML per convertirlo a un oggetto di leggerlo:

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

Quando stampo_r vedo gli attributi per il campo ma gli attributi per il valore accettabile non vengono visualizzati. Ecco un esempio di XML grezzo (Ho bisogno l'attributo value):

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

Questo è quello che vedo quando print_r:

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

                 [1] => 
        Invalid 

                 [2] => 
        Deleted 

                 [3] => 
        Valid/Good 

                 [4] => 
        Inactive 

                ) 

              ) 

Degli indizi perché gli attributi non vengono pubblicati? Grazie in anticipo.

EDIT: Richiesta di alcuni dei 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

Copia/incolla parte del codice xml originale, quindi non devo scaricarlo? – Norse

+0

sì, provando ad ottenere un po 'di mostrare – joshmmo

+1

lì andiamo a mostrare ora – joshmmo

risposta

7

La semplice risposta qui non è quella di utilizzare print_r() con oggetti SimpleXML. Poiché sono wrapper attorno a dati non-PHP, funzioni come quella che normalmente mostra l'oggetto "intero" non riflettono realmente ciò che stai guardando.

Il modo per accedere a un attributo con SimpleXML consiste nell'utilizzare il nome dell'attributo come se fosse una chiave di array ($node['attribute']); questo è non significa che c'è una matrice da qualche parte con quella chiave, è una chiamata-funzione sotto mentite spoglie.

Se vuoi avere un'idea di quali nodi stai guardando mentre scrivi il codice SimpleXML, controlla this simplexml_dump() function che ho scritto (feedback benvenuto).

+0

Non so se sto facendo qualcosa di sbagliato ma sembra che non funzioni per me, puoi vedere il mio codice/output qui http://i46.tinypic.com/wnqti.jpg – joshmmo

+0

@joshmmo Scuse, tendo a correre PHP con avvisi soppressi, poiché spesso si lamentano delle cose di cui sono felice. Aggiornerò la funzione per non sollevare quell'avviso quando accedo alla mia casella di sviluppo. L'output è comunque come previsto - non tenta di ricorrere attraverso l'intera struttura, ma solo di dirti che il nodo corrente è chiamato 'tabelle' e contiene 57 bambini chiamati 'tabella'.'simplexml_dump ($ tablesRaw-> children())' mostra qualcosa di più utile, o addirittura 'simplexml_dump ($ tablesRaw-> table [22] -> fields-> field [31] -> {'acceptable-values'} -> bambini()) ' – IMSoP

+0

molto bello mi piace. Sarebbe bello se potesse espandere l'intero oggetto per così dire, così posso vederlo tutto in una volta. – joshmmo

0

In primo luogo, è necessario ottenere l'oggetto SimpleXMLElement. In questo caso:

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

Ora, è possibile iterare su ogni oggetto acceptable-value e utilizzare il metodo attributes():

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

Con il vostro XML, che stamperà:

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

doesn fare affidamento sull'indice dell'array, perché la chiamata a attributes() ottiene gli attributi effettivi dell'elemento. E ->value ottiene l'attributo con il nome "valore".