отображать данные из XML с помощью php simplexml

У меня есть часть XML, которая выглядит следующим образом

<records count="2"> <record> <firstname>firstname</firstname> <middlename>middlename</middlename> <lastname>lastname</lastname> <namesuffix/> <address> <street-number>demo</street-number> <street-pre-direction/> <street-name>demo</street-name> <street-post-direction/> <street-suffix>demo</street-suffix> <city>demo</city> <state>NY</state> <zip>demo</zip> <zip4>demo</zip4> <county>demo</county> </address> <phonenumberdetails> <phonenumber>demo</phonenumber> <listed>demo</listed> <firstname>demo</firstname> </phonenumberdetails> <dob day="" month="" year=""/> <age/> <date-first month="10" year="1999"/> <date-last month="04" year="2011"/> </record> <record> <firstname>firstname</firstname> <middlename>middlename</middlename> <lastname>lastname</lastname> <namesuffix/> <address> <street-number>demo</street-number> <street-pre-direction/> <street-name>demo</street-name> <street-post-direction/> <street-suffix>demo</street-suffix> <city>demo</city> <state>NY</state> <zip>demo</zip> <zip4>demo</zip4> <county>demo</county> </address> <phonenumberdetails> <phonenumber>demo</phonenumber> <listed>demo</listed> <firstname>demo</firstname> </phonenumberdetails> <dob day="" month="" year=""/> <age/> <date-first month="10" year="1999"/> <date-last month="04" year="2011"/> </record> </records> 

Теперь я смог получить все данные на PHP с помощью SimpleXML, за исключением элементов даты и первого дня. Я использовал код, указанный ниже.

 $dateFirst = 'date-first'; $dateLast = 'date-last'; $streetNumber = 'street-number'; $streetPreDirection = 'street-pre-direction'; $streetName = 'street-name'; $streetPostDirection = 'street-post-direction'; $streetSuffix = 'street-suffix'; $unitDesignation = 'unit-designation'; $unitNumber = 'unit-number'; foreach ($reportDataXmlrecords->records->record as $currentRecord) { echo $currentRecord->$dateFirst['month'].'/'.$currentRecord->$dateFirst['year']; echo $currentRecord->$dateLast['month'].'/'.$currentRecord->$dateLast['year']; echo $currentRecord->address->$streetNumber; $currentRecord->address->$streetName; // ......and so on } 

где $reportDataXmlrecords является частью объекта simpleXML из родительского узла

Но первые два эха ничего не печатают, а все остальные печатаются правильно, в частности, я не могу получить доступ к данным в

 <date-first month="10" year="1999"/> <date-last month="04" year="2011"/> 

Также для отладки, если я это сделаю

 print_r($currentRecord->$dateFirst); 

он печатает

 SimpleXMLElement Object ( [@attributes] => Array ( [month] => 10 [year] => 1999 ) ) 

Любая помощь будет принята с благодарностью. Спасибо.

У вас проблема, когда вы это делаете

 $currentRecord->$dateFirst['month'] 

Сначала PHP будет оценивать $dateFirst['month'] в целом, прежде чем пытаться использовать его как свойство

 $dateFirst = 'date-first'; var_dump( $dateFirst['month'] ); // gives "d" 

потому что к строкам можно получить смещение с помощью нотации массива , но нецелые смещения преобразуются в целое число, и поскольку значение «месяц» для целого равно 0, вы пытаетесь сделать $currentRecord->d :

 $xml = <<< XML <record> <date-first month="jan"/> <d>foo</d> </record> XML; $record = simplexml_load_string($xml); $var = 'date-first'; echo $record->$var['month']; // foo 

Вы можете получить доступ к переносимым свойствам с фигурными фигурными скобками:

 $record->{'date-first'}['month'] // jan 

В случае сбоя, когда XML, показанный в вашем вопросе, действительно является XML, который вы загружаете с помощью SimpleXml, например, когда <records> является корневым узлом,

 $reportDataXmlrecords->records->record 

не может работать, потому что $reportDataXmlrecords уже является корневым узлом, и вам придется опустить ->records если вы хотите перебирать элементы записи в нем.