2012-09-14 21 views
5

Mam następujący dokument XML tutaj: Edit: (patrz poniżej próbki)PHP SimpleXML atrybuty są brakujące

używam php/SimpleXML że przekształca go na obiekt, aby ją przeczytać:

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

Kiedy drukuję print_r, widzę atrybuty dla pola, ale atrybuty dla wartości dopuszczalnej nie są wyświetlane. Oto przykład surowego XML (muszę atrybut wartość):

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

To, co widzę, kiedy print_r:

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

                 [1] => 
        Invalid 

                 [2] => 
        Deleted 

                 [3] => 
        Valid/Good 

                 [4] => 
        Inactive 

                ) 

              ) 

Wszelkie wskazówki, dlaczego atrybuty nie są wyświetlane? Z góry dziękuję.

EDIT: Zapytanie o niektóre 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

Czy skopiujesz/wkleisz część oryginalnego kodu xml, więc nie muszę go pobierać? – Norse

+0

tak, próbując uzyskać niektóre, aby pokazać – joshmmo

+1

tam możemy go pokazać teraz – joshmmo

Odpowiedz

7

Prostą odpowiedzią tutaj nie jest użycie print_r() z obiektami SimpleXML. Ponieważ są one owijkami wokół danych innych niż PHP, funkcje takie jak te, które normalnie pokazują "cały" obiekt, nie odzwierciedlają tego, na co patrzysz.

Aby uzyskać dostęp do atrybutu za pomocą SimpleXML, należy użyć nazwy atrybutu tak, jakby był kluczem tablicowym ($node['attribute']); to znaczy nie oznacza, że ​​istnieje gdzieś tablica z tym kluczem, jest to funkcja-wywołanie w przebraniu.

Jeśli chcesz się zorientować, na które węzły patrzysz, pisząc kod SimpleXML, sprawdź, this simplexml_dump() function, które napisałem (feedback welcome).

+0

Nie jestem pewien, czy robię coś źle, ale wygląda na to, że nie działa dla mnie, możesz zobaczyć mój kod/wyjście tutaj http://i46.tinypic.com/wnqti.jpg – joshmmo

+0

@joshmmo Przepraszam, mam tendencję do biec PHP z powiadomieniami stłumione, ponieważ często narzekają na rzeczy, z których jestem zadowolony. Zaktualizuję funkcję, aby nie podnosić tego Powiadomienia, gdy następnym razem zaloguję się do mojej skrzynki dev. Dane wyjściowe są jednak zgodne z oczekiwaniami - nie próbują rekurencyjnie przechodzić przez całą strukturę, tylko informują, że bieżący węzeł nosi nazwę "tabel" i zawiera 57 dzieci zwanych "tabelami".'simplexml_dump ($ tablesRaw-> children())' pokazuje coś bardziej użytecznego, a nawet 'simplexml_dump ($ tablesRaw-> table [22] -> fields-> field [31] -> {'acceptable-values'} -> children()) ' – IMSoP

+0

bardzo mi się podoba. Byłoby miło, gdyby mógł rozwinąć cały obiekt, by tak rzec, żebym mógł zobaczyć wszystko naraz. – joshmmo

0

Najpierw trzeba uzyskać obiekt SimpleXMLElement. W tym przypadku:

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

Teraz można iteracyjne nad każdego obiektu acceptable-value i użyć metody attributes():

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

Z Twojego XML, który będzie drukować:

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

To nie ma opiera się na indeksie tablicowym, ponieważ wywołanie do attributes() pobiera rzeczywiste atrybuty elementu. I ->value otrzymuje atrybut o nazwie "wartość".