如何为具有文本内容的节点设置属性?

时间:2011-11-24 11:28:36

标签: php xpath simplexml

我正在尝试迭代xpath给出的节点集,并为每个节点设置某个属性。但是,它仅适用于具有内容或空(空白)内容的节点。我尝试了两种方法,但结果相同(也许它们在更深层次上都是相同的,不知道)。注释行是第二种方法。

$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);

这是输出。节点刀中缺少属性id。:

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 :(得分:0)

我无法重现您描述的内容,更改的XML是:

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

Demo

这正是你的代码,也许你正在使用不同的LIBXML版本?请参阅LIBXML_VERSION常量(codepad viper has 20626(2.6.26))。

但可能只是print_r对象的SimpleXMLElement输出。

它不会输出最后一个元素的属性,即使是在一个全新的对象上,但它仍然可以访问该属性。 Demo

您将看到print_r($temp->knife['id']);何时设置了该属性(正如您在早期的XML输出中所看到的)。