Загрузка XML с помощью SimpleXML не возвращает атрибуты для некоторых элементов

Я загрузил XML-файл, используя

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

И для большей части XML при условии, что он работает нормально. Однако для некоторых элементов в XML атрибуты не преобразуются в массив «@attributes», а вместо этого пропускают выходные данные. Вот пример:

 <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> по <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> по <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> 

Это дает следующий результат print_r (я добавил разрыв строки в бит, который является проблемой):

 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 ) ) ) ) 

Как вы можете видеть, массив атрибутов правильно добавлен к большинству элементов, но не к элементам FIELD. Я попытался переименовать их, и это, похоже, не изменило ситуацию.

EDIT: Я также должен добавить, что я пытался окружить теги FIELD тегом FIELDS, также безрезультатно.

РЕДАКТИРОВАТЬ:

Я упростил XML, и он по-прежнему не возвращает атрибуты anny:

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

производит:

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

Доступны атрибуты, например:

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

print_r() не всегда показывает полную структуру с SimpleXML, но атрибуты там используются.

Извините, так много времени, чтобы вернуться и ответить на этот вопрос!

Как предположил MrCode, атрибуты были доступны. Проблема была в сериализации объекта SimpleXML в другом формате. Использование printr или json_convert в объекте while приводило к тому, что атрибуты не были доступны в зарегистрированных случаях.

Я не зашел достаточно далеко, чтобы найти способ обхода кода для печати или преобразования этих объектов, включая проблемные случаи, я просто работал вокруг него как часть данных XML:

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

Добавьте дополнительный уровень в иерархию, в результате чего атрибуты сохраняются на верхнем уровне, а текстовое значение доступно на уровне ниже.