首页 > 解决方案 > 更改子节点 SimpleXMLElement 的命名空间

问题描述

<ret2:formFields xsi:type="ret1:FormFieldsType" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

我想知道如何执行以下操作?xsi:type通过设置属性,孩子的命名空间正在改变。

我的代码:

$ret2FormFields = $ret2FileBody->addChild('ret2:formFields', null, 'http://www.w3.org/2001/XMLSchema-instance');
    $ret2FormFields->addAttribute("xsi:type", "ret1:FormFieldsType", 'http://www.w3.org/2001/XMLSchema-instance');

        $ret2FormFields->addChild('ret1:isReverseReplace', false);
        $ret2FormFields->addChild('ret1:payDayDate', '2018-04-10'); /** @todo date will be dynamic */

预期的 XML:

<ret2:formFields xsi:type="ret1:FormFieldsType" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <ret1:isReverseReplace>false</ret1:isReverseReplace>
    <ret1:payDayDate>2018-04-10</ret1:payDayDate>
</ret2:formFields>

我不正确的 XML:

<ret2:formFields xmlns:ret2="http://www.w3.org/2001/XMLSchema-instance" ret2:type="ret1:FormFieldsType">
    <ret1:isReverseReplace>false</ret1:isReverseReplace>
    <ret1:payDayDate>2018-04-10</ret1:payDayDate>
</ret2:formFields>

我被困在如何在ret1不更改父命名空间的情况下更改子命名空间ret2

标签: phpxmlsimplexml

解决方案


您将错误的名称空间传递到addChild此处:

addChild('ret2:formFields', null, 'http://www.w3.org/2001/XMLSchema-instance');

这告诉 SimpleXML 您希望元素具有前缀ret2和命名空间 URI http://www.w3.org/2001/XMLSchema-instance,因此它将生成:

<ret2:formFields xmlns:ret2="http://www.w3.org/2001/XMLSchema-instance">

您没有在示例ret2中显示文档中其他地方分配的前缀是什么,但这就是您需要提供的,例如:

addChild('ret2:formFields', null, 'http://example.org/mynamespaces/ret2');

推荐阅读