在 php 中将 XML 文档转换为数组时,有没有办法将其转换回来并将其保存为属性为元素的 XML 文件?

Posted

技术标签:

【中文标题】在 php 中将 XML 文档转换为数组时,有没有办法将其转换回来并将其保存为属性为元素的 XML 文件?【英文标题】:When converting an XML document to an Array in php, is there a way to convert it back and to save it as an XML file where attributes are elements? 【发布时间】:2021-03-08 15:18:23 【问题描述】:

我正在尝试在 php 中读取 XML 文件,编辑一些值并将其保存回来。 我通过在 php.ini 中打开 XML 文件来做到这一点。然后我使用 SimpleXML 将其转换为数组。在完成所需的操作后,由于我的 XML 元素如何转换为属性,我正在努力将该数组以相同的格式返回到 XML 文件中。因此,当我从数组转到 XML 时,我的元素(现在是属性)被保存为更新后的 XML 文件中的属性。 我想知道从 php 数组转换回 XML 时是否可以保留 XML 元素。

一个包含两个元素的随机 XML 示例,我们称之为 myFile.xml

<XML>
   <Project Element1 = 'some random value' Element2='Will be stored as attribute instead'>
</XML>
我将运行的 php 代码将其转换为数组
<?php
    $xml = simplexml_load_file("myFile.xml") or die("Error: Cannot create object");
    $arrayXML = json_decode(json_encode((array)$xml), TRUE);
    $arrayXML["Project"]["attributes"]["Element1"] = "updated value"
// I will then run some array to XML converter code here found online
// took it from here https://***.com/questions/1397036/how-to-convert-array-to-simplexml
    function array_to_xml( $data, &$xml_data ) 
        foreach( $data as $key => $value ) 
            if( is_array($value) ) 
                if( is_numeric($key) )
                    $key = 'item'.$key; //dealing with <0/>..<n/> issues
                
                $subnode = $xml_data->addChild($key);
                array_to_xml($value, $subnode);
             else 
                $xml_data->addChild("$key",htmlspecialchars("$value"));
            
         
    

    $xml_data = new SimpleXMLElement();
    array_to_xml($arrayNexus,$xml_data);
    saving generated xml file;
    $result = $xml_data->asXML('myFile.xml');
?>
像这样的东西会生成这样的 XML 文件
<XML>
     <Project>
          <attribute>
               <Element1>updated value</Element1>
               <Element2><Will be stored as attribute instead</Element2>
          </attribute>
     </Project>
</XML>

我想要的结果是什么时候

<XML>
   <Project Element1 = 'updated value' Element2='Will be stored as attribute instead'>
</XML>

我可以编写自己的 XML 转换器,但如果那里已经存在方法,有人可以告诉我方法吗?

【问题讨论】:

为什么要打扰杰森?您可以直接在xml中更改属性。 嘿杰克,所以为了示例,我或多或少地在这里重写了我的实际代码,但如果我没记错的话(我会在验证我要说的内容后再次评论,我目前无权访问我的代码)我必须进行 json 编码和解码是因为它会跳过我的第一个 XML 标记或由于某些原因完全忽略我的第一个键(XML 标记),但如果我不会通过json编码和解码传递它,再次感谢其他一些我不记得的***人,所以我不能相信他们。对不起 【参考方案1】:

不要转换 XML - 如果您不使用 JsonML 等特定格式,您将丢失数据。使用 DOM 要容易得多。使用 Xpath 表达式获取节点并修改它们。

$document = new DOMDocument();
$document->loadXML($xml);
$xpath = new DOMXpath($document);

// iterate the first 'Project' element
foreach($xpath->evaluate('(/XML/Project)[1]') as $project) 
    // change the attribute value
    $project->setAttribute('Element1', 'updated value');


echo $document->saveXML();

输出:

<?xml version="1.0"?>
<XML>
   <Project Element1="updated value" Element2="Will be stored as attribute instead"/>
</XML>

Xpath

“XML”文档元素/XML “项目”子元素/XML/Project 限于第一个找到的节点(/XML/Project)[1]

此示例使用结果列表中的位置作为条件,但如果项目具有 id 属性,您可以使用它来查找元素:/XML/Project[@id="example-id"]

【讨论】:

您能否添加使用 file_get_contents 而不是 simplexml_load_file 的 $xml 的精度。 其实我没有。我在带有变量$xml 的在线PHP shell 中编写了演示脚本。 Link 这样测试脚本是自包含的。在您的应用程序中,您可以使用 DOMDocument::load() 加载文件。

以上是关于在 php 中将 XML 文档转换为数组时,有没有办法将其转换回来并将其保存为属性为元素的 XML 文件?的主要内容,如果未能解决你的问题,请参考以下文章

在 PHP 中将多维数组转换为 XML 对象 [重复]

在 JavaScript 中将字符串转换为 XML 文档

如何在PHP中将对象转换为特定格式的数组

使用 PHP 将 XML 转换为关联数组

如何在 PHP 中将 XML 字符串转换为 DOMDocument?

如何在c#中将xml文档转换为数据表