CodeIgniter从URL读取解析XML报错:SimpleXMLElement参数类型错误
解决CodeIgniter中SimpleXMLElement构造参数错误的问题
你遇到的错误核心原因是:直接把POST请求的整个数组传给了SimpleXMLElement构造函数,而它需要的是XML字符串、文件路径或URL字符串,并非数组。以下是完整的修正方案:
第一步:修正控制器代码
需要单独提取输入的XML URL,从该URL加载XML内容,同时处理加载失败的异常,并将解析结果传回视图实现同一页面展示:
function read_xml(){ $parsed_data = array(); $data = []; // 检查表单是否提交 if($this->input->post('submit') !== NULL ){ // 获取用户输入的XML URL $xml_url = $this->input->post('txt_name'); if(!empty($xml_url)){ try { // 直接从URL加载XML,LIBXML_NOCDATA用于保留CDATA内容 $xml = new SimpleXMLElement($xml_url, LIBXML_NOCDATA, true); // 解析XML数据 foreach ($xml->id as $id) { $parsed_data[] = array( 'id' => (string)$id, 'state' => '', 'state_error' => '' ); } // 匹配state数据到对应id条目 $i = 0; foreach ($xml->state as $state) { if(isset($parsed_data[$i])){ $parsed_data[$i]['state'] = (string)$state; $parsed_data[$i]['state_error'] = (string)$state['error']; } $i++; } } catch (Exception $e) { // 捕获XML加载异常 $data['error'] = 'XML加载失败:' . $e->getMessage(); } } else { $data['error'] = '请输入有效的XML文件URL'; } } // 将解析数据和用户输入的URL传回视图 $data['parsed_data'] = $parsed_data; $data['xml_url'] = $this->input->post('txt_name'); // 加载对应视图文件(请根据实际视图文件名修改) $this->load->view('home_view', $data); }
第二步:完善视图代码
在原有表单基础上,添加错误提示和解析结果展示区域,实现同一页面交互:
<form method='post' action='<?= site_url('home/read_xml') ?>'> <table> <tr> <td>XML文件URL</td> <td><input type='text' name='txt_name' value="<?= isset($xml_url) ? $xml_url : '' ?>"></td> </tr> <tr> <td> </td> <td><input type='submit' name='submit' value='提交'></td> </tr> </table> </form> <!-- 显示错误信息 --> <?php if(isset($error)): ?> <p style="color: red;"><?= $error ?></p> <?php endif; ?> <!-- 显示解析结果 --> <?php if(!empty($parsed_data)): ?> <h3>XML解析结果</h3> <table border="1" cellpadding="8"> <tr> <th>ID</th> <th>State</th> <th>State Error</th> </tr> <?php foreach($parsed_data as $item): ?> <tr> <td><?= $item['id'] ?></td> <td><?= $item['state'] ?></td> <td><?= $item['state_error'] ?></td> </tr> <?php endforeach; ?> </table> <?php endif; ?>
关键修正说明
- 参数提取:用
$this->input->post('txt_name')单独获取用户输入的URL,而非整个POST数组 - XML加载:
SimpleXMLElement支持直接传入URL加载外部XML,第三个参数true允许加载外部实体 - 异常处理:通过try-catch捕获URL无效、XML格式错误等异常,给用户明确提示
- 页面复用:将解析数据和用户输入回传给视图,实现提交后在同一页面展示结果
内容的提问来源于stack exchange,提问作者Marcin Wierzycki
相关产品推荐
相关产品推荐

