【问题标题】:can I use str_replace in all xml nodes with php?我可以在所有带有 php 的 xml 节点中使用 str_replace 吗?
【发布时间】: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() 调用,但即使只有一个也不起作用。我是不是走错了路,还是我错过了什么?

【问题讨论】:

    标签: php xml str-replace xmlnode


    【解决方案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 文件中的每个字符,有效地破坏了文件......因此需要节点。但是,您的代码不适用于此方法。程序会遍历这些概念,甚至覆盖文件,但所有字母都保持不变。
    猜你喜欢
    • 2019-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-09
    • 1970-01-01
    相关资源
    最近更新 更多