Могу ли я использовать SimpleXML и Xpath для прямого выбора атрибута Elements?

то есть - я хочу вернуть строку "желтый", используя что-то вроде выражения xpath "//banana/@color" и следующий пример xml...

<fruits>
 <kiwi color="green" texture="hairy"/>
 <banana color="yellow" texture="waxy"/>
</fruits>


$fruits = simplexml_load_string(
'<fruits>
 <kiwi color="green" texture="hairy"/>
 <banana color="yellow" texture="waxy"/>
</fruits>');

print_r($fruits->xpath('//banana/@color'));

производит

Array
(
    [0] => SimpleXMLElement Object
        (
            [@attributes] => Array
                (
                    [color] => yellow
                )

        )

)

тогда как я бы предпочел что-то вроде...

Array
(
    [0] => SimpleXMLElement Object
        (
            [0] => yellow
        )

)

... так что мне не нужно писать особый случай в приложении, которое я пишу.

большое спасибо! :)


person significance    schedule 28.10.2010    source источник


Ответы (1)


Я только что попробовал ваш тест, потому что мне было любопытно, и я обнаружил, что он действительно создает строковое значение yellow при преобразовании в строку.

$fruits = simplexml_load_string(
'<fruits>
 <kiwi color="green" texture="hairy"/>
 <banana color="yellow" texture="waxy"/>
</fruits>');

$found = $fruits->xpath('//banana/@color');
echo $found[0];

Казалось бы, именно так представлены узлы атрибутов SimpleXmlElement. Таким образом, вы можете использовать это как (string) $found[0], если вы не печатаете/отображаете его напрямую.

Конечно, если вы зависите от оставшегося значения SimpleXMLElement, то это может быть проблемой, я полагаю. Но я думаю, что просто помнить о преобразовании в строку, когда вы собираетесь использовать узел позже, все равно можно.

ЕСЛИ вам действительно нужен подробный интерфейс для узлов, который поддерживает атрибут в качестве узла, вы можете просто переключиться на DOMDocument. Ваш код станет более подробным, но реализация станет более понятной.

person prodigitalson    schedule 28.10.2010