Могу ли я использовать SimpleXML & Xpath для непосредственного выбора атрибута элементов? - PullRequest
4 голосов
/ 28 октября 2010

то есть - я хочу вернуть строку "yellow", используя что-то вроде выражения 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
        )

)

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

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

1 Ответ

7 голосов
/ 28 октября 2010

Я только что сделал ваш тест, потому что мне было любопытно, и я обнаружил, что он действительно выдает строковое значение 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. Ваш код станет более подробным, но реализация станет более понятной.

...