borislavsabev/simple-xml-loader

一个极简的 SimpleXml 加载器。封装了 simplexml_load_XXXX() 方法并提供错误处理。

v1.0.0 2017-07-22 21:52 UTC

This package is not auto-updated.

Last update: 2024-09-15 02:26:03 UTC


README

一个极简的 SimpleXml 加载器。封装了 simplexml_load_XXXX() 方法并提供 libxml 错误处理。

主要目标

  • 提供对 SimpleXML 的 simplexml_load_file()simplexml_load_string() 函数的透明 OOP 接口
  • 处理 SimpleXML 的内部错误
  • 抛出可捕获的异常(XmlLoaderException)

此包装器将

  • 尝试将您的 XML 资源加载到 \SimpleXMLElement 对象中并返回它
  • 处理加载过程中发生的任何 LibXML 错误

此包装器将不会

  • 做其他任何事情

安装

此软件包可在 Packagist 上获取,并通过 Composer 安装

composer require borislavsabev/simple-xml-loader

基本用法

由于这是一个包装器,因此包装库的功能未在本文档中介绍。请参阅

SimpleXMlLoader 中有两个主要函数

public function loadFile($filename, $xmlClass = "SimpleXMLElement", $options = 0, $xmlNamespace = "", $isPrefix = false)

public function loadString($data, $xmlClass = "SimpleXMLElement", $options = 0, $xmlNamespace = "", $isPrefix = false)

加载器在发生任何错误时抛出 XmlLoaderException。抛出的异常包含最后一个 \LibXmlError 的消息和代码。加载器调用旨在被 try/catch 块包装,并自行读取任何错误

   use BorislavSabev\SimpleXmlLoader\XmlLoader;
   use BorislavSabev\SimpleXmlLoader\Exception\XmlLoaderException;

   $xmlLoader = new XmlLoader();
   try {
       /** @var \SimpleXMLElement $simpleXmlElement */
       $simpleXmlElement = $xmlLoader->loadFile($filename);
       
       //Now do something with the loaded \SimpleXMLElement...
   } catch (XmlLoaderException $e) {
       // The last error is contained in $e:
       $e->getMessage();
       $e->getCode();
       //All errors accessible through the payload:
       /** @var array $xmlErrors */
       $xmlErrors = $xmlLoader->getXmlPayload()
                              ->getXmlErrors();
   }

XmlLoader 实例旨在重复使用,因此

  • 每次调用 XmlLoader->loadFile()XmlLoader->loadString() 都会清除存储的任何 LibXML 错误
  • 每次调用 XmlLoader->loadFile()XmlLoader->loadString() 都会替换其内部 XmlLoaderPayload 对象

循环使用

连续调用加载器方法的每次调用都会重置 LibXML 的状态和您必须提取调用之间所有数据的负载

   use BorislavSabev\SimpleXmlLoader\XmlLoader;
   use BorislavSabev\SimpleXmlLoader\Exception\XmlLoaderException;

   $xmlLoader = new XmlLoader();
   
   foreach ($aBunchOfXmlStrings as $xmlString) {
       try {
            /** @var \SimpleXMLElement $simpleXmlElement */
            $simpleXmlElement = $xmlLoader->loadString($xmlString);
       } catch (XmlLoaderException $e) {
           /** @var array $xmlErrors */
           $xmlErrors = $xmlLoader->getXmlPayload()
                                  ->getXmlErrors();
       }
       
       //Any data within LibXML or our XmlLoaderPayload will be lost after this iteration of the loop
   }

重复使用 XmlLoaderPayload

您还可以根据需要在自己的应用程序中重复使用 XmlLoaderPayload。例如,您可以使用此包装器解析不同的 XML 文件,但后来想将结果传递给您的代码中的不同服务以处理任何业务逻辑。您只需获取 XmlLoaderPayload 并将其传递给特定服务(或其他任何东西)即可

   use BorislavSabev\SimpleXmlLoader\XmlLoader;
   use BorislavSabev\SimpleXmlLoader\Exception\XmlLoaderException;

   $xmlLoader = new XmlLoader();
   try {
       $xmlLoader->loadFile($filename);

       //Generic example:
       $serviceBroker->pass(
           MyCoolService::class,
           $xmlLoader->getXmlPayload()
       );
   } catch (XmlLoaderException $e) {
       /** @var array $xmlErrors */
       $xmlErrors = $xmlLoader->getXmlPayload()
                              ->getXmlErrors();
   }

注意:通常,您应该有自己的负载对象来在您的领域内部传递数据。XmlLoaderPayload 的想法是作为 XmlLoader 的内部对象,因此它不能包含任何超出该任务之外的逻辑。

行为覆盖

此库仅引入了一种行为更改
"如果您将空字符串传递给 simplexml_load_string(),它将返回 false 并不抛出错误".
SimpleXmlLoader 包装器在这种情况下抛出 XmlLoaderException

XmlLoaderException 和 LibXML 的 libXMLError

XmlLoaderException 的代码特定于此包装器。LibXML 的 libXMLError 对象仅作为数组返回,并从 SimpleXML/LibXML 接收。

对 SimpleXML PHP 扩展的个人看法

通常,SimpleXML 不是一个稳健的 PHP 扩展,在我看来,当您需要快速完成某些简单操作时,应该很少使用它。任何严肃的工作都应通过 DomDocument 完成。
前两句话是作者的个人信息,任何观点都应该谨慎对待。

版本控制

这个库遵循Semver规范。根据Semver规范,您可以在不更改公共API的情况下升级到该库的任何小版本或补丁版本。Semver还要求我们明确定义该库的公共API。
所有具有public可见性的方法都是公共API的一部分。所有其他方法都不是公共API的一部分。在可能的情况下,我们将努力保持protected方法在小版本/补丁版本中的向后兼容性,但如果您正在重写方法,请在升级前测试您的工作。

贡献

请这样做!我们非常欢迎PR。作者并不认为这个包装库是完美的。任何PR都必须首先遵守这个库设定的[主要目标](#Main goals)。

请注意,该项目遵循贡献者公约v1.4。通过参与本项目,您同意遵守其条款。