simplexml_load_file – избыточный элемент с пустым значением преобразуется в новый объект SimpleXMLElement

Я конвертирую 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 ) ) 

Я могу работать с этими проблемами:

  1. Подсчитывать постоянный порядок в XML (числовой индекс)
  2. Доказательство, если значение имеет тип SimpleXMLElement, чтобы определить, является ли он пустым.

Но это не похоже на хорошее решение для меня.

Я что-то делаю неправильно или какие-то идеи, что я могу сделать?

Большое спасибо

Мне не совсем понятно, о чем вы просите, но если вы хотите узнать, имеет ли значение 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, а также в следующем вопросе:

  • SimpleXML: выбор элементов, которые имеют определенное значение атрибута (декабрь 2009 г.)
  • Значение доступа через родительский атрибут (июнь 2010 г.)
  • Справка по доступу к атрибуту xml в php (август 2010 г.)
  • Условия выполнения в XPath (август 2010)

В прошлый раз, когда я расширил SimpleXMLElement на Stackoverflow, я получил ответ на вывод 5 последних эскизов из public flickr api с использованием atom_1 и php .

Нет, на самом деле оказалось, что в прошлый раз, когда я расширил SimpleXMLElement на Stackoverflow, я объяснял точно такой же доступ к значению атрибута в вопросе PHP / XML – как читать многопользовательские субтитры