如何将更改的 SimpleXML 对象保存回文件?

Posted

技术标签:

【中文标题】如何将更改的 SimpleXML 对象保存回文件?【英文标题】:How to save changed SimpleXML object back to file? 【发布时间】:2011-03-26 00:08:45 【问题描述】:

所以,我有这段代码在我的 XML 文件中搜索特定节点,取消设置现有节点并插入具有正确数据的全新子节点。有没有办法让这些新数据使用 simpleXML 保存在实际的 XML 文件中?如果没有,是否有另一种有效的方法来做到这一点?

public function hint_insert() 

    foreach($this->hints as $key => $value) 

        $filename = $this->get_qid_filename($key);

        echo "$key - $filename - $value[0]<br>";

        //insert hint within right node using simplexml
        $xml = simplexml_load_file($filename);

        foreach ($xml->PrintQuestion as $PrintQuestion) 

            unset($xml->PrintQuestion->content->multichoice->feedback->hint->Passage);

            $xml->PrintQuestion->content->multichoice->feedback->hint->addChild('Passage', $value[0]);

            echo("<pre>" . print_r($PrintQuestion) . "</pre>");
            return;

        

    


【问题讨论】:

【参考方案1】:

不确定我是否理解该问题。 asXML() 方法接受一个可选文件名作为参数,它将当前结构作为 XML 保存到文件中。因此,一旦您使用提示更新了 XML,只需将其保存回文件即可。

// Load XML with SimpleXml from string
$root = simplexml_load_string('<root><a>foo</a></root>');
// Modify a node
$root->a = 'bar';
// Saving the whole modified XML to a new filename
$root->asXml('updated.xml');
// Save only the modified node
$root->a->asXml('only-a.xml');

【讨论】:

【参考方案2】:

如果要保存,可以使用dom_import_simplexml转换为DomElement并保存:

$dom = new DOMDocument('1.0');
$dom->preserveWhiteSpace = false;
$dom->formatOutput = true;
$dom->loadXML($simpleXml->asXML());
echo $dom->saveXML();

【讨论】:

那么看看我上面的代码,这会将我更新的 $xml 对象保存到 $filename 是什么? 我尝试将其更改为 $dom = new DOMDocument('1.0'); $dom->preserveWhiteSpace = false; $dom->格式输出=真; $dom->loadXML($xml->asXML()); $dom->保存($文件名);但文件中仍然没有更新 好的,实际上它现在可以使用 $dom->save($filename)...谢谢! @Sarfraz 您的示例不使用dom_import_simplexml。您正在从asXML() 加载XML 字符串,这是使用SimpleXml 输出或保存文件 的函数,那么为什么要使用DOM?使用 DOM 的唯一优势是您可以格式化输出,这仅在人们手动创作时才需要。 @Gordon:我忘了添加那行,但后来在看到 OP 的评论后,他说它有效,然后我不再写了,否则是的,它是需要的,现在你的评论就在那里OP,如果他愿意的话。

以上是关于如何将更改的 SimpleXML 对象保存回文件?的主要内容,如果未能解决你的问题,请参考以下文章

PHP simpleXML如何以格式化的方式保存文件?

C# 问题:如何将在 DataGridView 中所做的更改保存回使用的 DataTable?

如何引用 xargs 中保存的对象/字符串的基本名称

如何序列化/反序列化 SimpleXML 对象?

simpleXML技术解析xml文件(php)

循环一个 SimpleXML 对象,或者把整个对象变成一个数组