отсутствуют атрибуты php SimpleXML
У меня здесь есть следующий xml-документ: Редактировать: (пример см. Ниже)
Я использую 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>
Вот что я вижу, когда печатаю_r:
[acceptable-values] => SimpleXMLElement Object
(
[acceptable-value] => Array
(
[0] =>
Unknown
[1] =>
Invalid
[2] =>
Deleted
[3] =>
Valid/Good
[4] =>
Inactive
)
)
Есть какие-нибудь подсказки, почему атрибуты не отображаются? Заранее спасибо.
ИЗМЕНИТЬ: Запрос на некоторые из 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>
2 answers
Простой ответ здесь заключается в том, чтобы не использовать 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
получает атрибут с именем "значение".