runopencode / sax
XML SAX (类似JAVA) 解析器
Requires
- ext-dom: *
- ext-simplexml: *
- ext-xml: *
- psr/http-message: ~1.0
- roave/security-advisories: dev-master
Requires (Dev)
- php: >=8.2
- escapestudios/symfony2-coding-standard: ^3.13.0
- guzzlehttp/psr7: ^2.6
- mockery/mockery: ^1.6.11
- pdepend/pdepend: ^2.16.2
- phploc/phploc: ^2.0.5
- phpmd/phpmd: ^2.15.0
- phpstan/phpstan: ^1.10.64
- phpunit/phpunit: ^9.5
- sebastian/phpcpd: ^2.0.1
- squizlabs/php_codesniffer: ^3.9.0
- theseer/phpdox: ^0.7.0
- vimeo/psalm: ^5.6.0
Suggests
- guzzlehttp/psr7: Provides PSR-7 StreamInterface implementation.
README
此库允许您以Java风格使用SAX解析XML文档:而不是通过这些令人讨厌的函数和回调来处理事件(请参阅官方PHP文档示例这里),您只需继承提供的抽象类 RunOpenCode\Sax\Handler\AbstractSaxHandler
并实现其所有抽象方法。
使用此库的主要好处是代码清晰、易于阅读。
示例
class MySaxHandler extends RunOpenCode\Sax\Handler\AbstractSaxHandler {
// ... your implementation
}
$result = RunOpenCode\Sax\SaxParser::factory()->parse(new MySaxHandler(), $myXmlDocumentResource);
需要实现的方法列表
onDocumentStart
:在解析XML文档开始时执行。onElementStart
:在解析器遇到新的XML标签时执行。onElementData
:在解析器遇到某些XML标签的CDATA时执行。onElementEnd
:在解析器遇到已关闭的已打开XML标签时执行。onDocumentEnd
:在解析XML文档完成后执行。onParseError
:在解析错误触发时执行。getResult
:在解析过程的最后执行,您应在此处向调用者提供解析结果。
由于SAX解析器的常见用法是有一个当前工作元素栈,因此类 RunOpenCode\Sax\Handler\AbstractStackedSaxHandler
中也有一个该原型实现。它扩展了 RunOpenCode\Sax\Handler\AbstractSaxHandler
并提供了通过 getCurrentElementName()
获取当前工作元素的选项,以及通过 getStackSize()
获取栈大小的选项。
重要注意事项
- 由于PHP XML解析器的底层实现,所有相关事件调用中的标签名都提供为大写。例如,如果您有标签
<tag></tag>
,在相关事件方法中检查标签名的代码应为if ($name === 'TAG')
。 onParseError
事件由于不可恢复的解析错误而触发,但是否触发错误并继续执行取决于您和您的用例。onElementData
事件即使在XML文档中的标签之间只有空白空间时也会触发。
SaxParser 和 StreamAdapterInterface
RunOpenCode\Sax\SaxParser
是一个实用类,可简化您对SaxHandler实现的用法。SaxHandler使用 Psr\Http\Message\StreamInterface
实现作为解析XML文档的源,但是StreamAdapters可以帮助您处理各种XML文档源,例如
- 资源(文件资源或PHP本地流)
- DOMDocument
- SimpleXMLElement
如果您需要其他类型的XML文档源,您可以通过实现 RunOpenCode\Sax\Contract\StreamAdapterInterface
来提供它,并且您可以通过调用 SaxParser::addStreamAdapter()
方法将注册到 RunOpenCode\Sax\SaxParser
实例。
当您调用 SaxParser::parse()
时,在解析之前,提供的XML文档的源将检查可用的适配器并将其转换为 Psr\Http\Message\StreamInterface
实现。
此库推荐 guzzlehttp/psr7 并将其用作默认 StreamInterface
实现,但您可以使用任何其他满足您需求的实现。
变更日志
2017年2月21日。
- BC break:更改API,不再使用回调,调用
parse()
方法应返回解析结果。
2017年2月10日。
- 已停止支持PHP 5.x
- 将PHPUnit 6.x添加为需求
- 添加了lib异常