【问题标题】:Parse XML file within laravel在 laravel 中解析 XML 文件
【发布时间】:2016-11-17 15:49:27
【问题描述】:

我想从我的计算机中选择一个 XML 文件进行解析。该表格有效,我可以使用 Input::file('file');功能。但是,我想通过仅将其作为临时文件上传来解析此文档。当我想解析它时,我得到如下错误:“无法从字符串解析”。解析器似乎找不到该文件。我尝试了两个解析器:SimpleXML 和 XMLParser(来自管弦乐队)。

public function uploadFile(Request $ file){
$data =Input::file('file');
$informationdata = array('file' => $data);
$rules = array(
    'file' => 'required|mimes:xml|Max:10000000',
    );
    $validator=  Validator::make($informationdata, $rules);
    if($validator->fails()){
        echo 'the file has not the correct extension';
    } else{
        XmlParser::load($data->getRealPath());
    }

我也尝试在存储文件后解析它。

private function store($data){
    $destinationPath = public_path('uploads\\');
    $fileName = $data->getClientOriginalName();
    $data->move($destinationPath,$fileName);
    $xml = simplexml_load_file($destinationPath.$fileName);
    }

提前感谢您的帮助。

【问题讨论】:

    标签: php xml parsing laravel-5.2


    【解决方案1】:

    当您说“解析”时,您是什么意思?寻找节点?删除节点?添加节点?还是只读取节点?

    因为您可以使用 SimpleXMLElement 类查找和阅读,但如果您想添加或删除,我建议您改用 DomDocument。

    使用 SimpleXMLElement,构造将是:

    $xml = new SimpleXMLElement($destinationPath.$fileName, null, true);
    

    虽然 DomDocument 是:

    $xml = new DomDocument('1.0', 'utf-8'); // Or the right version and encoding of your xml file
    $xml->load($destinationPath.$fileName);
    

    创建对象后,您可以处理所有文档。

    【讨论】:

    • XML 文件包含一个大的 (base64) 字符串,必须从文件中检索该字符串。下一步是解码这个字符串,这给了我另一个 xml 字符串。
    • 将代码调整为您的 SimpleXMLElement 示例后,出现以下错误:simplexml_load_file(): file:///C:/path/to/file.xml:29: parser error : Extra content在文档末尾
    • 这意味着您的 XML 格式不正确。你为什么不展示你的xml文件的样本?
    【解决方案2】:

    目前尚不清楚,您是想验证计算机上的一些现有 xml 文件,还是想实现用户上传任何 xml 文件并编写一些逻辑来处理此任务的能力。然而,这不是重点。

    我建议您使用 PHP 核心内建的 simplexml_load_file() 函数,该函数对我的项目有帮助。因为你永远不会让 Laravel 将 xml 解析为一些体面的、可理解的数组或对象,以便通过 Request $file 注入等方式使用。这适用于 html-forms 或 json,而不适用于 xml 或其他格式。

    这就是为什么您应该使用将是(例如)此类代码的结果的对象:

    $xml_object = simplexml_load_file($request->file('action')->getRealPath());
    

    然后你需要自己验证每个 xml 节点和字段,编写一些逻辑,因为你失去了使用 Laravel 内置的 Illuminate\Http\Request validate() 方法的可能性。

    【讨论】:

      猜你喜欢
      • 2018-09-08
      • 1970-01-01
      • 2018-07-03
      • 2011-05-18
      • 2017-12-22
      • 2011-03-06
      • 2013-07-17
      • 2013-01-10
      • 1970-01-01
      相关资源
      最近更新 更多