Как установить атрибут для узлов с текстовым содержимым? - PullRequest
0 голосов
/ 24 ноября 2011

Я пытаюсь перебрать множество узлов, заданных xpath, и установить определенный атрибут для каждого узла. Однако он работает только для узлов без содержимого или с пустым (пробельным) содержимым. Я пробовал 2 подхода, но с одинаковым результатом (возможно, они оба одинаковы на более глубоком уровне, не знаю). Закомментированная строка - второй подход.

$temp = simplexml_load_string (
'<toolbox>
    <hammer/>
    <screwdriver>   </screwdriver>
    <knife>
        sharp
    </knife>
</toolbox>' );

echo "vanilla toolbox: ";
print_r($temp);

$nodes = $temp->xpath('//*[not(@id)]');

foreach($nodes as $obj) {
    $tempdom = dom_import_simplexml($obj);
    $tempdom->setAttributeNode(new DOMAttr('id', 5));
    //$obj->addAttribute('bagr', 5);
}

echo "processed toolbox: ";
print_r($temp);

Это вывод. В ноже нет идентификатора атрибута.

vanilla toolbox: SimpleXMLElement Object
(
[hammer] => SimpleXMLElement Object
    (
    )

[screwdriver] => SimpleXMLElement Object
    (
        [0] =>    
    )

[knife] => 
        sharp

)
processed toolbox: SimpleXMLElement Object
(
[@attributes] => Array
    (
        [id] => 5
    )

[hammer] => SimpleXMLElement Object
    (
        [@attributes] => Array
            (
                [id] => 5
            )

    )

[screwdriver] => SimpleXMLElement Object
    (
        [@attributes] => Array
            (
                [id] => 5
            )

        [0] =>    
    )

[knife] => 
        sharp

1 Ответ

0 голосов
/ 24 ноября 2011

Я не могу воспроизвести то, что вы описываете, измененный XML:

<?xml version="1.0"?>
<toolbox id="5">
    <hammer id="5"/>
    <screwdriver id="5">   </screwdriver>
    <knife id="5">
        sharp
    </knife>
</toolbox>

Демо

Это именно ваш код, возможно, вы используетедругая версия LIBXML?См. Константу LIBXML_VERSION (кодовая панель viper имеет 20626 (2.6.26)).

Но, вероятно, это всего лишь вывод print_r для объекта SimpleXMLElement.

Это невыведите атрибуты для последнего элемента, даже на совершенно новом объекте, но все еще возможно получить доступ к атрибуту. Демонстрация .

Когда вы print_r($temp->knife['id']); увидите, что атрибут установлен (вы увидите это в предыдущем выводе XML).

...