【问题标题】:Update XML node attribute更新 XML 节点属性
【发布时间】:2014-12-02 10:59:13
【问题描述】:

我正在尝试以下但没有成功。谁能帮我解释一下为什么属性 imageId 没有改变?

$dom = new DOMDocument;
$dom->loadXML($appCom_file_name);
$frames = $dom->getElementsByTagName('frame');
foreach ($frames as $frame) {
    if ($frame->getAttribute('imageId') == '') {
        $frame->setAttribute('imageId', $id);
    } 
}

$dom->saveXML();

XML 来源:

<template>
    <appCom>
        <page>
            <defaultValues>
                <frame id="frame_01_0" deltaRotation="0" deltaScale="100" deltaX="0" deltaY="0" imageId="" />
                <frame id="frame_02_0" deltaRotation="0" deltaScale="100" deltaX="0" deltaY="0" imageId="" />
                <frame id="frame_03_0" deltaRotation="0" deltaScale="100" deltaX="0" deltaY="0" imageId="" />
            </defaultValues>
        </page>
        <page>
            <defaultValues>
                <frame id="frame_01_1" deltaRotation="0" deltaScale="100" deltaX="0" deltaY="0" imageId="" />
                <frame id="frame_02_1" deltaRotation="0" deltaScale="100" deltaX="0" deltaY="0" imageId="" />
                <frame id="frame_03_1" deltaRotation="0" deltaScale="100" deltaX="0" deltaY="0" imageId="" />
            </defaultValues>
        </page>
    </appCom>
</template>

【问题讨论】:

  • 尝试使用引用的 foreach foreach ($frames as &amp;$frame)
  • 感谢@Justinas 的快速回复,但没有帮助。还有其他想法吗?
  • 当你打印出 if 里面的东西时,它会显示出来吗?
  • @Justinas 是的,它已经显示出来了,我已经尝试过,看看它的效果如何。它正确循环所有节点并打印 if 中的任何内容,但属性没有更改。

标签: php xml setattribute


【解决方案1】:

我测试了您的代码,显然,我收到了一个错误,即 $id 未定义。您是否尝试过更改此行:

$frame->setAttribute('imageId', $id);

到这里:

$frame->setAttribute('imageId', $frame->getAttribute('id'));

?

当然,要将结果打印到屏幕上,您可以使用echo:

echo $dom->saveXML();

【讨论】:

    【解决方案2】:

    感谢所有反馈!

    它不应该输出任何东西,而是再次保存文件。 ID 当然是定义的,但我忘记在我的问题中包含它。现在可以了:

    $id = 1;
    
    $dom = new DOMDocument;
    $dom->loadXML(file_get_contents($appCom_file_name));
    $frames = $dom->getElementsByTagName('frame');
    foreach ($frames as $frame) {
        if ($frame->getAttribute('imageId') == '') {
            $frame->setAttribute('imageId', $id);
        } 
    }
    
    $dom->save($appCom_file_name);
    

    【讨论】:

    • @silkfire 我使用的是 $dom->saveXML() 而不是 $dom->save()。而且我在加载 XML 文件时也在使用 file_get_contents()。
    【解决方案3】:

    我认为你必须使用带有参数的 saveXML...这是我的灵感代码:

    $dom = new DOMDocument();
    $dom->loadXML($datas);
    
    $svg = $dom->getElementsByTagName('svg');                        
    $resize = $this->resize(452, 480, $res);
    $svg->item(0)->setAttribute('width', $resize['w']);  
    $svg->item(0)->setAttribute('height', $resize['h']); 
    $datas = '<?xml version="1.0" encoding="UTF-8" tandalone="no"?>'.$dom->saveXML($svg->item(0));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-01
      • 1970-01-01
      • 2013-10-07
      • 2013-07-24
      相关资源
      最近更新 更多