我遇到了DOMDocument的一个问题::getElementsByTagNameNS,当我试图替换一个节点,或者我试图修改元素,一个是是,一个不是被修改的--这就是我的例子:
$xml = <<<EOD
<html xmlns:x="helloworld">
<head>
<title>ClasseAS - Home</title>
<meta name="title" content="Hello World"/>
<meta name="keywords" content="hello"/>
<x:hello/>
<x:hello/>
<x:hello/>
<x:hello/>
</head>
</html>
EOD;
$DOMDocument = new DOMDocument("1.0","utf-8");
$DOMDocument->loadXML($xml);
foreach ($DOMDocument->getElementsByTagNameNS("helloworld","*") as $element){
if($element->localName == "hello"){
$else = $element;
$fragment = $DOMDocument->createDocumentFragment();
$fragment->appendXML("<div id=\"hello\"></div>");
$else->parentNode->replaceChild($fragment,$else);
}
}
$HTML = $DOMDocument->saveXML();
echo "<pre>".htmlentities($HTML)."</pre>";
?>我的错误在哪里?提前为我的糟糕英语道歉
发布于 2014-09-06 22:06:21
DOMNodeList(由$DOMDocument->getElementsByTagNameNS("helloworld","*")返回)处于活动状态,当您替换节点时,将修改NodeList。
一些伪代码来澄清这种行为:
foreach(liveNodeList as $index => $element){
//1st loop
[node0, node1, node2, node3]
//$index 0_^
//$element is node0
//2nd loop
[node1, node2, node3]
//$index 1_______^
//$element is node2
//3rd loop
[node1, node3]
//$index 2____________^
//end of loop
}$index是0,NodeList包含4个元素。原始NodeList的第一项将被替换(并从NodeList中移除)$index是1,但是NodeList现在只包含3个元素(第一个元素已被替换/删除)。$element现在是NodeList中具有$index 1的节点,但是循环必须再次用$index 0替换节点以获得所需的结果。原始Nodelist的第三项将被替换。$index是2,NodeList现在包含两个元素,$index点在NodeList的末尾。可能的解决办法:
在NodeList的末尾启动节点替换:
for($i=$DOMDocument->getElementsByTagNameNS("helloworld","*")->length-1;
$i>=0;--$i){
$element=$DOMDocument->getElementsByTagNameNS("helloworld","*")->item($i);
if($element->localName == "hello"){
$fragment = $DOMDocument->createDocumentFragment();
$fragment->appendXML("<div id=\"hello\"></div>");
$element->parentNode->replaceChild($fragment,$element);
}
}发布于 2014-09-08 08:18:27
如果使用XPath选择元素,则可以在foreach循环中更可靠地操作它们:
$xpath = new DOMXPath($DOMDocument);
$xpath->registerNamespace('h', 'helloworld');
foreach ($xpath->query('//h:hello') as $element) {https://stackoverflow.com/questions/25704576
复制相似问题