borislavsabev / simple-xml-loader
一个极简的 SimpleXml 加载器。封装了 simplexml_load_XXXX() 方法并提供错误处理。
Requires
- ext-libxml: *
- ext-simplexml: *
Requires (Dev)
- phpunit/phpunit: ^5.7
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。通过参与本项目,您同意遵守其条款。