Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何为包含文本内容的节点设置属性?_Php_Xpath_Simplexml - Fatal编程技术网

Php 如何为包含文本内容的节点设置属性?

Php 如何为包含文本内容的节点设置属性?,php,xpath,simplexml,Php,Xpath,Simplexml,我试图迭代xpath给定的一组节点,并为每个节点设置某些属性。但是,它仅适用于没有内容或空白内容的节点。我尝试过两种方法,但结果相同,也许在更深层次上它们都是相同的,不知道。注释行是第二种方法 $temp = simplexml_load_string ( '<toolbox> <hammer/> <screwdriver> </screwdriver> <knife> sharp &

我试图迭代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);

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

<?xml version="1.0"?>
<toolbox id="5">
    <hammer id="5"/>
    <screwdriver id="5">   </screwdriver>
    <knife id="5">
        sharp
    </knife>
</toolbox>
这正是您的代码,也许您使用的是不同的LIBXML版本?请参阅LIBXML_版本常量代码板viper拥有20626 2.6.26

但它可能只是SimpleXMLElement对象的打印输出

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


您将在打印_r$temp->knife['id']时看到;正如您在前面的XML输出中看到的那样,设置了该属性

为什么要使用$tempdom->setAttributeNodenew-DOMAttr'id',5;而不是$tempdom->setAttribute'id',5;?无论如何,代码似乎是正确的。你使用的是什么版本的PHP?我的版本中似乎有一个bug。正如我在下面所说的,我使用的是PHP版本5.3.8-pl0-gentoo和libxml版本2.7.8。请注意,设置属性的方式要复杂得多。您只需将foreach$节点作为$obj{$obj['id']=5;}执行即可。还请注意,除非您使用DTD或模式将id属性定义为实际的id类型属性,否则您的id属性将只是一个通用属性,不考虑用于任何IDREF。另请看,谢谢,我也知道这种方法,但我想显式地显示调用了哪些函数。实际上,您的演示代码确实复制了它。它在转储中提供[knife]=>sharp,例如w\out id属性。它没有将刀列为简单元素。不过,将其序列化为XML仍然有效。我使用的是PHP版本5.3.8-pl0-gentoo和libxml版本2.7.8。@Jan当您打印\r$temp->knife时;您将看到刀子SimpleXmlElement的转储包含id属性。我不知道为什么print_r$temp只会做[刀]=>锋利。但话说回来,我不必担心转储DOM或SimpleXmlElement实例。人们都知道它们在垃圾堆里很古怪,因为它们暴露内部的方式。哦,我的上帝!你完全正确!我怀疑输出可能不正确,但只能通过尝试print\u r和var\u dump来解决。你一针见血。我如何才能将您的评论标记为最相关的答案?这可能是SimpleXMLElement与print_r组合的一个缺陷,它只是不输出案例中最后一个元素的属性。我在答案中添加了另一个演示,它只是一块带有属性集的XML。但是,使用$temp->knife['id']访问确实有效。可能是错误/缺陷?
<?xml version="1.0"?>
<toolbox id="5">
    <hammer id="5"/>
    <screwdriver id="5">   </screwdriver>
    <knife id="5">
        sharp
    </knife>
</toolbox>