我正在尝试迭代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
答案 0 :(得分:0)
我无法重现您描述的内容,更改的XML是:
<?xml version="1.0"?>
<toolbox id="5">
<hammer id="5"/>
<screwdriver id="5"> </screwdriver>
<knife id="5">
sharp
</knife>
</toolbox>
这正是你的代码,也许你正在使用不同的LIBXML版本?请参阅LIBXML_VERSION
常量(codepad viper has 20626(2.6.26))。
但可能只是print_r
对象的SimpleXMLElement
输出。
它不会输出最后一个元素的属性,即使是在一个全新的对象上,但它仍然可以访问该属性。 Demo
您将看到print_r($temp->knife['id']);
何时设置了该属性(正如您在早期的XML输出中所看到的)。