我可以在所有带有 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 吗?的主要内容,如果未能解决你的问题,请参考以下文章

php如何解析多级xml报文?

xml查找节点父节点并删除simplexml php

在 PHP 中显示特定的 XML 节点

在XSLT中输出内容带有CDATA的XML节点

带有 php 和重音字符以及 ENT_XML1 的 XML 的 UTF-8 编码

使用php替换xml中的特定节点值