我可以在所有带有 php 的 xml 节点中使用 str_replace 吗?
Posted
技术标签:
【中文标题】我可以在所有带有 php 的 xml 节点中使用 str_replace 吗?【英文标题】:can I use str_replace in all xml nodes with php? 【发布时间】:2013-12-01 05:08:33 【问题描述】:我认为问题出在我的逻辑上,我可能会以错误的方式解决这个问题。我想要的是
用php打开一个xml文档 按标签名称获取元素 那么对于每个具有子节点的节点 将每个字母a
替换为 ა
每个 b
替换为 ბ
等等。
这是我的代码,但它不起作用。
xmlDoc=loadXMLDoc("temp/word/document.xml");
$nodes = xmlDoc.getElementsByTagName("w:t");
foreach ($nodes as $node)
while( $node->hasChildNodes() )
$node = $node->childNodes->item(0);
$node->nodeValue = str_replace("a","ა",$node->nodeValue);
$node->nodeValue = str_replace("b","ბ",$node->nodeValue);
$node->nodeValue = str_replace("g","გ",$node->nodeValue);
$node->nodeValue = str_replace("d","დ",$node->nodeValue);
// More replacements for each letter in the alphabet.
我认为这可能是因为多个str_replace()
调用,但即使只有一个也不起作用。我是不是走错了路,还是我错过了什么?
【问题讨论】:
【参考方案1】:$node
变量在每次迭代时都会被覆盖,因此只有最后一个 $node
会被修改(如果有的话)。您需要在循环内进行替换,然后使用saveXML()
方法返回修改后的 XML 标记。
您的代码(有一些改进):
$xmlDoc = new DOMDocument();
$xmlDoc->load('temp/word/document.xml');
foreach ($xmlDoc->getElementsByTagName("w:t") as $node)
while($node->hasChildNodes())
$node = $node->childNodes->item(0);
$search = array('a', 'b', 'g', 'd');
$replace = array('ა', 'ბ', 'გ', 'დ');
$node->nodeValue = str_replace($search, $replace, $node->nodeValue);
echo $xmlDoc->saveXML();
【讨论】:
啊这看起来不错,所以这仍然会将替换应用于每个 w:t 标签 @gcoulby:是的;为什么不试试看呢? 我不得不离开家。我会在一小时后回来,我会更新你。并在它工作后标记为正确,我确信它会。 如果我将搜索和替换数组与 'code'$xmlContents = file_get_contents($word_dir);取消链接($word_dir); file_put_contents($word_dir, $xmlContents);'code' 这种方法的问题是它改变了 XML 文件中的每个字符,有效地破坏了文件......因此需要节点。但是,您的代码不适用于此方法。程序会遍历这些概念,甚至覆盖文件,但所有字母都保持不变。 让我们continue this discussion in chat以上是关于我可以在所有带有 php 的 xml 节点中使用 str_replace 吗?的主要内容,如果未能解决你的问题,请参考以下文章