2012-04-20 7 views
5

mam załadowany plik XML przy użyciuŁadowanie XML przy użyciu SimpleXML nie zwraca atrybuty w niektórych elementów

simplexml_load_file($filePath,'SimpleXMLElement', LIBXML_NOCDATA); 

I dla większości XML pod warunkiem, że działa dobrze. Jednak w przypadku niektórych elementów w XML atrybuty nie są przekształcane w tablicę "@attributes", a zamiast tego brakuje ich na wyjściu. Oto przykład:

<UI_DEFINITION> 
<EDIT_PERMISSION>testPermission</EDIT_PERMISSION> 
<DEFAULT_VALUES> 
    <display>hidden</display> 
    <css_class>generic_css_class</css_class> 
    <title>{tag}</title> 
    <type>string</type> 
    <wrapper_format>{value}</wrapper_format> 
    <full_path>false</full_path> 
    <mandatory>false</mandatory> 
    <edit_permission>testPermission</edit_permission> 
    <max_length>0</max_length> 
</DEFAULT_VALUES> 
<LOOKUPS> 
    <DB_LOOKUP name="test3"> 
     <VIEW>???</VIEW> 
     <ID_FIELD>???</ID_FIELD> 
     <DESCR_FIELD>???</DESCR_FIELD> 
     <ORDER>??? asc</ORDER> 
    </DB_LOOKUP> 
    <DB_LOOKUP name="test1"> 
     <VIEW>???</VIEW> 
     <ID_FIELD>???</ID_FIELD> 
     <DESCR_FIELD>???</DESCR_FIELD> 
     <ORDER>??? asc</ORDER> 
    </DB_LOOKUP> 
</LOOKUPS> 
<AREA internal_name="main_details" title="" display="show"> 
    <FIELD lookup="test1" title="Title">Title</FIELD> 
    <FIELD title="Name">Given_Name</FIELD> 
    <FIELD title="Mid. Name(s)">Middle_Names</FIELD> 
    <FIELD title="Family Name">Family_Name</FIELD> 
    <FIELD title="Gender">Gender</FIELD> 
    <FIELD title="Born" type="date">Date_of_Birth</FIELD> 
    <FIELD max_length="20" title="ID">Unique_Identifier</FIELD> 
</AREA> 

To daje następujące dane wyjściowe z print_r (dodałem podział wiersza na bit, który jest problem):

SimpleXMLElement Object ([UI_DEFINITION] => SimpleXMLElement Object ([EDIT_PERMISSION] => testPermission [DEFAULT_VALUES] => SimpleXMLElement Object ([display] => hidden [css_class] => generic_css_class [title] => {tag} [type] => string [wrapper_format] => {value} [full_path] => false [mandatory] => false [edit_permission] => testPermission [max_length] => 0) [LOOKUPS] => SimpleXMLElement Object ([DB_LOOKUP] => Array ([0] => SimpleXMLElement Object ([@attributes] => Array ([name] => test3) [VIEW] => ??? [ID_FIELD] => ??? [DESCR_FIELD] => ??? [ORDER] => ??? asc) [1] => SimpleXMLElement Object ([@attributes] => Array ([name] => test1) [VIEW] => ??? [ID_FIELD] => ??? [DESCR_FIELD] => ??? [ORDER] => ??? asc))) 
[AREA] => SimpleXMLElement Object ([@attributes] => Array ([internal_name] => main_details [title] => [display] => show) [FIELD] => Array ([0] => Title [1] => Given_Name [2] => Middle_Names [3] => Family_Name [4] => Gender [5] => Date_of_Birth [6] => Unique_Identifier)))) 

Jak widać, tablica atrybutów jest poprawnie dodana do większości elementów, ale nie do elementów FIELD. Próbowałem zmienić ich nazwy i nie miało to większego znaczenia.

EDYTOWANIE: Należy również dodać, że próbowałem otaczających tagów FIELD z tagiem FIELDS, również na próżno.

EDIT:

uprościłem XML ogromnie, a to wciąż nie wraca Anny atrybuty:

<UI_DEFINITION> 
          <FIELD lookup="test1" title="Title">Title</FIELD> 
        </UI_DEFINITION> 

produkuje:

SimpleXMLElement Object ([UI_DEFINITION] => SimpleXMLElement Object ([FIELD] => Title)) 
+1

Znalazłem odpowiedź, ale nie mogę odpowiedzieć samodzielnie przez 7 godzin. Problem polega na tym, że SimpleXML nie dopuszcza atrybutów i tekstu na tym samym elemencie. W miarę możliwości opublikuję pełną odpowiedź. – alitheg

Odpowiedz

4

Przepraszam, że tak długo wróciłem i odpowiedziałem na to pytanie!

Zgodnie z sugestią MrCode atrybuty były dostępne pod. Problem z serializacją obiektu SimpleXML w innym formacie. Użycie polecenia printr lub json_convert w obiekcie while spowoduje, że atrybuty będą niedostępne w zgłoszonych przypadkach.

nie idzie wystarczająco daleko do tego, aby znaleźć obejście kodu oparte na druku lub konwersji tych obiektów w tym problematycznych przypadkach, po prostu pracował wokół niego jako część danych XML:

<UI_DEFINITION> 
     <FIELD lookup="test1" title="Title"><VALUEPATH>Title</VALUEPATH></FIELD> 
</UI_DEFINITION> 

Dodanie tego dodatkowego poziomu do hierarchii skutkowało zachowaniem atrybutów na najwyższym poziomie, a wartość tekstowa była dostępna poprawnie na poziomie podrzędnym.

8

atrybuty są dostępne dla przykład:

$obj = simplexml_load_string($xml); 

foreach($obj->AREA->FIELD as $field) 
{ 
    echo $field->attributes()->title . '<br />'; 
} 

print_r() nie zawsze pokazuje pełną strukturę z SimpleXML, ale atrybuty są tam do użycia.

+0

Dzięki za odpowiedź. Zobacz komentarz dodany do pytania. Jednak wypróbowanie podanego kodu zapewniło mi lepszy wgląd w problem: – alitheg

+0

Naciśnięcie przycisku wprowadź posty zamiast podziału wiersza. Więc używając pętli for udało mi się uzyskać atrybuty, jak sugerowałeś. To, czego nie dodałem, polegało na tym, że w dalszej części strony używam json_convert na wynikowym obiekcie.Wydaje się, że ograniczenia, które dostrzegam, występują w druku lub serializacji, ale nie w bezpośredniej interakcji w PHP, jeśli ma to sens. – alitheg

+0

Jeśli wszystko jest w porządku, wolałbym zaakceptować odpowiedź, którą zamieszczę, ponieważ pokazuje ona problem bardziej wyraźnie, ale dodam to. Nie mogę cię przyjąć, ponieważ nie mam wystarczającej reputacji. Dzięki! – alitheg

Powiązane problemy