将 XML 文档转换为 php 中的数组时,有没有办法将其转换回来并将其另存为属性为元素的 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?

我正在尝试读取 PHP 中的 XML 文件,编辑一些值并将其保存回来。 我通过在 php 中打开 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 
    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 - 如果您不使用 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
  • 'Project'子元素
    /XML/Project
  • 限制为第一个找到的节点
    (/XML/Project)[1]

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