У меня есть часть 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
если вы хотите перебирать элементы записи в нем.