PHP数组转XML问题:NumberOfUnits标签重复生成修正求助
解决PHP数组生成XML时重复NumberOfUnits节点的问题
我帮你搞定这个问题啦!你遇到的核心问题是数组结构设计不对,导致XML生成工具把每个NumberOfUnit都单独包裹在了NumberOfUnits节点里,而不是把所有NumberOfUnit放在同一个NumberOfUnits节点下。
错误原因分析
你之前的写法是每次往NumberOfUnits数组里新增一个包含NumberOfUnit的子数组:
$new_timesheet['Timesheet']['TimesheetLines']['TimesheetLine']['NumberOfUnits'][]['NumberOfUnit'] = array('8.00'); $new_timesheet['Timesheet']['TimesheetLines']['TimesheetLine']['NumberOfUnits'][]['NumberOfUnit'] = array('9.00');
这种结构会被XML生成器解析为多个独立的NumberOfUnits节点,每个节点下只有一个NumberOfUnit。
修正后的数组代码
正确的做法是让NumberOfUnits成为一个包含NumberOfUnit数组的节点,所有的数值都放在这个NumberOfUnit数组里:
$new_timesheet = array(); $new_timesheet['Timesheet'] = array(); $new_timesheet['Timesheet']['EmployeeID'] = '8534e85a-e398-4041-99b1-cce51e7a8a02'; $new_timesheet['Timesheet']['StartDate'] = "2018-01-22"; $new_timesheet['Timesheet']['EndDate'] = "2018-01-28"; $new_timesheet['Timesheet']['Status'] = "Draft"; // 注意:预期XML里没有Hours字段,如果不需要可以删掉这一行 // $new_timesheet['Timesheet']['Hours'] = "5.0"; $new_timesheet['Timesheet']['TimesheetLines'] = array(); $new_timesheet['Timesheet']['TimesheetLines']['TimesheetLine'] = array(); $new_timesheet['Timesheet']['TimesheetLines']['TimesheetLine']['EarningsRateID'] = '0daff504-2d42-4243-bdac-24f2bae0ce7c'; // 初始化NumberOfUnits节点,里面包含一个NumberOfUnit数组 $new_timesheet['Timesheet']['TimesheetLines']['TimesheetLine']['NumberOfUnits'] = array( 'NumberOfUnit' => array() ); // 逐个添加NumberOfUnit的值 $new_timesheet['Timesheet']['TimesheetLines']['TimesheetLine']['NumberOfUnits']['NumberOfUnit'][] = '8.00'; $new_timesheet['Timesheet']['TimesheetLines']['TimesheetLine']['NumberOfUnits']['NumberOfUnit'][] = '9.00'; $new_timesheet['Timesheet']['TimesheetLines']['TimesheetLine']['NumberOfUnits']['NumberOfUnit'][] = '8.00'; $new_timesheet['Timesheet']['TimesheetLines']['TimesheetLine']['NumberOfUnits']['NumberOfUnit'][] = '8.00'; $new_timesheet['Timesheet']['TimesheetLines']['TimesheetLine']['NumberOfUnits']['NumberOfUnit'][] = '8.00'; $new_timesheet['Timesheet']['TimesheetLines']['TimesheetLine']['NumberOfUnits']['NumberOfUnit'][] = '0.00'; $new_timesheet['Timesheet']['TimesheetLines']['TimesheetLine']['NumberOfUnits']['NumberOfUnit'][] = '0.00';
如果你想一次性赋值所有NumberOfUnit,也可以简化成这样:
$new_timesheet['Timesheet']['TimesheetLines']['TimesheetLine']['NumberOfUnits']['NumberOfUnit'] = array( '8.00', '9.00', '8.00', '8.00', '8.00', '0.00', '0.00' );
修正后生成的XML效果
这样调整后,生成的XML就会符合你的预期:
<Timesheets> <Timesheet> <EmployeeID>8534e85a-e398-4041-99b1-cce51e7a8a02</EmployeeID> <StartDate>2018-01-22</StartDate> <EndDate>2018-01-28</EndDate> <Status>Draft</Status> <TimesheetLines> <TimesheetLine> <EarningsRateID>0daff504-2d42-4243-bdac-24f2bae0ce7c</EarningsRateID> <NumberOfUnits> <NumberOfUnit>8.00</NumberOfUnit> <NumberOfUnit>9.00</NumberOfUnit> <NumberOfUnit>8.00</NumberOfUnit> <NumberOfUnit>8.00</NumberOfUnit> <NumberOfUnit>8.00</NumberOfUnit> <NumberOfUnit>0.00</NumberOfUnit> <NumberOfUnit>0.00</NumberOfUnit> </NumberOfUnits> </TimesheetLine> </TimesheetLines> </Timesheet> </Timesheets>
原理很简单:XML生成工具会把数组的键映射为XML节点名,当你给NumberOfUnits设置一个包含NumberOfUnit数组的值时,它就会生成一个NumberOfUnits父节点,里面包含所有NumberOfUnit子节点,而不是重复创建NumberOfUnits节点。
内容的提问来源于stack exchange,提问作者user3099268
相关产品推荐
相关产品推荐

