отсутствуют атрибуты 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>
Author: joshmmo, 2012-09-15

2 answers

Простой ответ здесь заключается в том, чтобы не использовать print_r() с объектами SimpleXML. Поскольку они являются оболочками для данных, отличных от PHP, подобные функции, которые обычно отображают "весь" объект, на самом деле не отражают то, на что вы смотрите.

Способ доступа к атрибуту с помощью SimpleXML заключается в использовании имени атрибута, как если бы это был ключ массива ($node['attribute']); это не не означает, что где-то есть массив с этим ключом, это скрытый вызов функции.

Если вы хотите чтобы понять, на какие узлы вы смотрите при написании кода SimpleXML, ознакомьтесь с этой simplexml_dump() функцией , которую я написал (приветствуется обратная связь).

 7
Author: IMSoP, 2012-09-15 12:30:12

Во-первых, вы должны получить объект 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 получает атрибут с именем "значение".

 0
Author: Kenny Linsky, 2012-09-15 04:29:07