You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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>&nbsp;</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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 04:50:45