在 laravel 中解析 XML 文件
Posted
技术标签:
【中文标题】在 laravel 中解析 XML 文件【英文标题】:Parse XML file within laravel 【发布时间】: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);
提前感谢您的帮助。
【问题讨论】:
【参考方案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() 方法的可能性。
【讨论】:
以上是关于在 laravel 中解析 XML 文件的主要内容,如果未能解决你的问题,请参考以下文章