Loading XML using SimpleXML doesn't return attributes on some elements

attributes, parsing, php, simplexml

Solution

Sorry it's taken so long to come back and answer this question!

As MrCode suggested, the attributes were accessible. The problem I was in the serialisation of the SimpleXML object into another format. Using printr or json_convert on the while object resulted in the attributes not being available in the cases reported.

I didn't go far enough into this to find a code-based workaround for printing or converting these objects including the problematic cases, I simply worked around it as part of the XML data:

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

Addint this extra level into the hierarchy resulted in the attributes being preserved at the top level, and the text value being available correctly at the sub-level.

Problem

I have loaded an XML file using ``` simplexml_load_file($filePath,'SimpleXMLElement', LIBXML_NOCDATA); ``` And for most of the XML provided it works fine. However, for some of the elements in the XML the attributes are not converted into an '@attributes' array, and are instead missing form the output. Here's a sample: ``` <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> ``` This gives the following output from print_r (I've added a line break at the bit that's the 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 ) ) ) ) ``` As you can see, the attributes array is correctly added to most of the elements, but not to the FIELD elements. I've tried renaming them and it didn't seem to make a difference. EDIT: I should also add that I've tried surrounding the FIELD tags with a FIELDS tag, also to no avail. EDIT: I've simplified the XML hugely, and it still doesn't return anny attributes: ``` <UI_DEFINITION> <FIELD lookup="test1" title="Title">Title</FIELD> </UI_DEFINITION> ``` produces: ``` SimpleXMLElement Object ( [UI_DEFINITION] => SimpleXMLElement Object ( [FIELD] => Title ) ) ```

Original source