Нахождение значения ребенка в определенном атрибуте - PullRequest
2 голосов
/ 20 января 2010
<data>
    <gig id="1">
    <date>December 19th</date>
    <venue>The Zanzibar</venue>
    <area>Liverpool</area>
    <telephone>Ticketline.co.uk</telephone>
    <price>£6</price>
    <time>Time TBA</time>
</gig>
<gig id="2">
    <date>Sat. 16th Jan</date>
    <venue>Celtic Connection, Classic Grand</venue>
    <area>Glasgow</area>
    <telephone>0141 353 8000</telephone>
    <price>£17.50</price>
    <time>7pm</time>
</gig>

Скажите, если бы я хотел просмотреть значения "date" из элемента gig, который имеет атрибут 2, как я мог бы сделать это с помощью php?

Обычно я хочу удалить say id 2, а затем создать его заново или просто изменить его.

используя simpleXML, как я могу просто удалить определенную часть?

1 Ответ

1 голос
/ 20 января 2010

Чтобы найти узлы, используйте XPath .

$data->xpath('//gig[@id="2"]');

Он вернет массив со всеми <gig/> узлами с атрибутом id, значение которого равно 2. Обычно он будет содержать 0 или 1 элемент. Вы можете изменить их напрямую. Например:

$data = simplexml_load_string(
    '<data>
        <gig id="1">
            <date>December 19th</date>
            <venue>The Zanzibar</venue>
            <area>Liverpool</area>
            <telephone>Ticketline.co.uk</telephone>
            <price>£6</price>
            <time>Time TBA</time>
        </gig>
        <gig id="2">
            <date>Sat. 16th Jan</date>
            <venue>Celtic Connection, Classic Grand</venue>
            <area>Glasgow</area>
            <telephone>0141 353 8000</telephone>
            <price>£17.50</price>
            <time>7pm</time>
        </gig>
    </data>'
);

$nodes = $data->xpath('//gig[@id="2"]');

if (empty($nodes))
{
    // didn't find it
}

$gig = $nodes[0];
$gig->time = '6pm';

die($data->asXML());

Удаление произвольных узлов на порядок сложнее, поэтому гораздо проще изменить значения, чем удалять / воссоздавать узел.

...