1

我正在尝试在 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://stackoverflow.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 转换器,但如果已经存在方法,有人可以告诉我方法吗?

4

1 回答 1

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"]

于 2020-11-28T22:46:06.793 回答