Я конвертирую XML-файл в объект с помощью simplexml_load_file. Я заметил проблему, когда элемент redunant имеет пустое значение.
Я думаю, что этот пример делает его более понятным:
// XML-File (Just a small excerpt look at "...") ... <Team uID="t684"> ... <Player loan="" uID="p20388"> <Name>Manuel Neuer</Name> <Position>Goalkeeper</Position> <Stat Type="first_name">Manuel</Stat> <Stat Type="last_name">Neuer</Stat> <Stat Type="middle_name"></Stat> <Stat Type="known_name"></Stat> <Stat Type="birth_date">1986-03-27</Stat> <Stat Type="birth_place"></Stat> <Stat Type="first_nationality"></Stat> <Stat Type="deceased"></Stat> <Stat Type="preferred_foot"></Stat> <Stat Type="weight">92</Stat> <Stat Type="height">193</Stat> <Stat Type="jersey_num">1</Stat> <Stat Type="real_position">Goalkeeper</Stat> <Stat Type="real_position_side">Unknown</Stat> <Stat Type="join_date">2011-07-01</Stat> <Stat Type="country">Germany</Stat> </Player> ... </Team> ... // print_r (simplexml_load_file) ... [Player] => Array ( [0] => SimpleXMLElement Object ( [@attributes] => Array ( [loan] => [uID] => p20388 ) [Name] => Manuel Neuer [Position] => Goalkeeper [Stat] => Array( [0] => Manuel [1] => Neuer [2] => SimpleXMLElement Object ( [@attributes] => Array ( [Type] => middle_name ) ) [3] => SimpleXMLElement Object ( [@attributes] => Array ( [Type] => known_name ) ) [4] => 1986-03-27 [5] => SimpleXMLElement Object ( [@attributes] => Array ( [Type] => birth_place ) ) [6] => SimpleXMLElement Object ( [@attributes] => Array ( [Type] => first_nationality ) ) [7] => SimpleXMLElement Object ( [@attributes] => Array ( [Type] => deceased ) ) [8] => SimpleXMLElement Object ( [@attributes] => Array ( [Type] => preferred_foot ) ) [9] => 92 [10] => 193 [11] => 1 [12] => Goalkeeper [13] => Unknown [14] => 2011-07-01 [15] => Germany ) )
Было бы лучше, когда «Type» -name использовалось как Array Key, поэтому мне не нужно рассчитывать на порядок в XML-файле. Но по крайней мере пустое значение элемента xml также должно быть пустым значением в массиве.
например
<Stat Type="middle_name"></Stat>
должно быть
[2] =>
вместо
[2] => SimpleXMLElement Object ( [@attributes] => Array ( [Type] => middle_name ) )
Я могу работать с этими проблемами:
Но это не похоже на хорошее решение для меня.
Я что-то делаю неправильно или какие-то идеи, что я могу сделать?
Большое спасибо
Мне не совсем понятно, о чем вы просите, но если вы хотите узнать, имеет ли значение SimpleXMLElement значение Node или нет, вы можете использовать функцию strlen()
в PHP.
Он примет контекст строки SimpleXMLElement, который является его узловым значением (по крайней мере для тех листовых узлов, которые у вас есть в вашем вопросе), и поэтому вернет 0, когда узел пуст и больше нуля, если он содержит текст.
Доступ к детям по значению атрибута не поддерживается SimpleXMLElement из коробки. Array-Access работает так, как описано для доступа к атрибутам, а не к детям; См. Пример # 5 Использование атрибутов .
Однако вы можете расширить SimpleXMLElement, чтобы добавить эту функциональность, например, чтобы получить детей по значению атрибута Type
:
class MyXMLElement extends SimpleXMLElement { public function byType($value) { list($result) = ((array)$this->getByAttribute('Type', $value)) + array(NULL); return $result[0]; } public function getByAttribute($attribute, $value) { return $this->xpath(sprintf('.//*[@%s = "%s"]', $attribute, $value)); } }
Этот новый вариант можно использовать вместо старого, чтобы вы могли легко получить доступ к тому, что вы ищете:
$team = simplexml_load_string($buffer, 'MyXMLElement'); echo "Team ", $team['uID'], " Player(s):\n"; foreach($team->Player as $i => $player) { printf(" %d. %s %s\n", $i + 1, $player->byType('first_name'), $player->byType('last_name')); }
Это, например, с приведенным примером, который у вас есть в вашем вопросе, который делает <Team>
выходными элементами корневого элемента:
Team t684 Player(s): 1. Manuel Neuer
Вы найдете доступ к дочерним элементам по атрибуту в контуре SimpleXML, а также в следующем вопросе:
В прошлый раз, когда я расширил SimpleXMLElement на Stackoverflow, я получил ответ на вывод 5 последних эскизов из public flickr api с использованием atom_1 и php .
Нет, на самом деле оказалось, что в прошлый раз, когда я расширил SimpleXMLElement на Stackoverflow, я объяснял точно такой же доступ к значению атрибута в вопросе PHP / XML – как читать многопользовательские субтитры