У меня есть следующий XML-документ здесь: Edit: (см. Ниже пример)
Я использую php / SimpleXML, чтобы скрыть его до объекта, чтобы его прочитать:
$xmlContent = file_get_contents($path . '/test.xml'); $tablesRaw = new SimpleXMLElement($xmlContent); echo '<pre>'; print_r($tablesRaw); echo '</pre>';
Когда я печатаю_r, я вижу атрибуты для поля, но атрибуты для допустимого значения не отображаются. Вот пример необработанного xml (мне нужен атрибут value):
<acceptable-value value="0"> Unknown </acceptable-value>
Это то, что я вижу, когда print_r:
[acceptable-values] => SimpleXMLElement Object ( [acceptable-value] => Array ( [0] => Unknown [1] => Invalid [2] => Deleted [3] => Valid/Good [4] => Inactive ) )
Любые подсказки, почему атрибуты не отображаются? Заранее спасибо.
EDIT: запрос для некоторых из xml:
<field name="Address1Type" type="String"/> <field name="Address2Street1" type="String"/> <field name="Address2Street2" type="String"/> <field name="Address2Type" type="String"/> <field name="Address3Street1" type="String"/> <field name="Status" type="Integer" access="R"> <acceptable-values> <acceptable-value value="0"> Unknown </acceptable-value> <acceptable-value value="1"> Invalid </acceptable-value> <acceptable-value value="2"> Deleted </acceptable-value> <acceptable-value value="3"> Valid/Good </acceptable-value> <acceptable-value value="4"> Inactive </acceptable-value> </acceptable-values> </field>
Простой ответ здесь заключается не в использовании print_r()
с объектами SimpleXML. Поскольку они являются обертками вокруг данных, отличных от PHP, такие функции, которые обычно отображают «весь» объект, на самом деле не отражают то, что вы смотрите.
Способ доступа к атрибуту с SimpleXML заключается в использовании имени атрибута, как если бы это был ключ массива ( $node['attribute']
); это не означает, что есть какой-то массив с этим ключом, это переопределение функции-вызова.
Если вы хотите понять, на каких узлах вы смотрите при написании кода SimpleXML, проверьте эту simplexml_dump()
которую я написал (приветствуется обратная связь).
Во-первых, вы должны получить объект SimpleXMLElement. В этом случае:
$xmlContent = file_get_contents($path . '/test.xml'); $tablesRaw = new SimpleXMLElement($xmlContent); $elements = $tablesRaw->table[22]->fields->field[31]->{'acceptable-values'}->children();
Теперь вы можете перебирать каждый объект acceptable-value
и использовать метод attributes()
:
foreach($elements as $element) { echo $element->attributes()->value . " "; echo trim($element[0]) . "\n"; }
С вашим XML, который будет печатать:
0 Unknown 1 Invalid 2 Deleted 3 Valid/Good 4 Inactive
Он не полагается на индекс массива, потому что вызов attributes()
получает фактические атрибуты элемента. И ->value
получает атрибут с именем «значение».