XML SAX (类似JAVA) 解析器

4.0 2024-03-28 10:27 UTC

This package is auto-updated.

Last update: 2024-08-28 11:24:31 UTC


README

Packagist Scrutinizer Code Quality Code Coverage Build Status Build Status

SensioLabsInsight

此库允许您以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异常