init: Erste Version aus Test-App erstellen
This commit is contained in:
@@ -0,0 +1,6 @@
|
|||||||
|
/.idea
|
||||||
|
/composer.lock
|
||||||
|
/vendor
|
||||||
|
/codeception.yml
|
||||||
|
/tests/*.suite.yml
|
||||||
|
/tests/_*/
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
paths:
|
||||||
|
tests: tests
|
||||||
|
output: tests/_output
|
||||||
|
data: tests/_data
|
||||||
|
support: tests/_support
|
||||||
|
envs: tests/_envs
|
||||||
|
actor_suffix: Tester
|
||||||
|
extensions:
|
||||||
|
enabled:
|
||||||
|
- Codeception\Extension\RunFailed
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
{
|
||||||
|
"name": "torsten-hettstedt/sax-xml-reader",
|
||||||
|
"description": "SAX-XML-Readertest",
|
||||||
|
"minimum-stability": "stable",
|
||||||
|
"license": "GPL-3.0-or-later",
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Torsten L\u00fccke",
|
||||||
|
"email": "developer@torsten-hettstedt.de"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"require": {
|
||||||
|
"php": ">=7.4",
|
||||||
|
"ext-xml": "*"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"codeception/codeception": "^4.1.18",
|
||||||
|
"codeception/module-asserts": "^1.3.1",
|
||||||
|
"phpstan/phpstan": "^1.4.7",
|
||||||
|
"codeception/module-phpbrowser": "^1.0.0"
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"TorstenHettstedt\\XmlReader\\Sax\\": "src"
|
||||||
|
},
|
||||||
|
"exclude-from-classmap": [
|
||||||
|
"/example/",
|
||||||
|
"/.idea/"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"autoload-dev": {
|
||||||
|
"psr-4": {
|
||||||
|
"TorstenHettstedt\\XmlReader\\Sax\\Tests\\Unit\\": "tests/unit",
|
||||||
|
"TorstenHettstedt\\XmlReader\\Sax\\Tests\\Helper\\": "tests/_support/Helper"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
parameters:
|
||||||
|
level: 6
|
||||||
|
paths:
|
||||||
|
- src
|
||||||
|
- tests/unit
|
||||||
|
- tests/_support/Helper
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace TorstenHettstedt\XmlReader\Sax;
|
||||||
|
|
||||||
|
interface XmlReaderInterfaces
|
||||||
|
{
|
||||||
|
|
||||||
|
function tag_open(string $tag_name, array $attributes): void;
|
||||||
|
|
||||||
|
function cdata(string $tag_name, string $cdata): void;
|
||||||
|
|
||||||
|
function tag_close(string $tag_name): void;
|
||||||
|
}
|
||||||
@@ -0,0 +1,75 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace TorstenHettstedt\XmlReader\Sax;
|
||||||
|
|
||||||
|
use InvalidArgumentException;
|
||||||
|
|
||||||
|
class XmlSaxParser
|
||||||
|
{
|
||||||
|
protected $parser;
|
||||||
|
protected XmlReaderInterfaces $xmlReader;
|
||||||
|
protected string $actualTagName = '';
|
||||||
|
|
||||||
|
public function __construct(XmlReaderInterfaces $xml_reader)
|
||||||
|
{
|
||||||
|
$this->xmlReader = $xml_reader;
|
||||||
|
$this->parser = xml_parser_create();
|
||||||
|
|
||||||
|
xml_set_object($this->parser, $this);
|
||||||
|
xml_set_element_handler($this->parser, "tag_open", "tag_close");
|
||||||
|
xml_set_character_data_handler($this->parser, "cdata");
|
||||||
|
}
|
||||||
|
|
||||||
|
public function __destruct()
|
||||||
|
{
|
||||||
|
xml_parser_free($this->parser);
|
||||||
|
unset($this->parser);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function parse($data):void
|
||||||
|
{
|
||||||
|
xml_parse($this->parser, $data);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $path
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
* @throws InvalidArgumentException
|
||||||
|
*/
|
||||||
|
public function parseFile(string $path): void
|
||||||
|
{
|
||||||
|
// open xml file
|
||||||
|
if (!($handle = fopen($path, "r"))) {
|
||||||
|
throw new InvalidArgumentException('could not open XML file "' . $path . '".');
|
||||||
|
}
|
||||||
|
|
||||||
|
while ($data = fread($handle, 4096)) { // read xml file
|
||||||
|
$this->parse($data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @noinspection PhpUnusedParameterInspection */
|
||||||
|
protected function tag_open($parser, string $tag_name, array $attributes):void
|
||||||
|
{
|
||||||
|
$this->actualTagName = $tag_name;
|
||||||
|
if ($this->actualTagName !== '') {
|
||||||
|
$this->xmlReader->tag_open($tag_name, $attributes);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @noinspection PhpUnusedParameterInspection */
|
||||||
|
protected function cdata($parser, string $cdata):void
|
||||||
|
{
|
||||||
|
if ($this->actualTagName !== '' && trim($cdata) !== '') {
|
||||||
|
$this->xmlReader->cdata($this->actualTagName, $cdata);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @noinspection PhpUnusedParameterInspection */
|
||||||
|
protected function tag_close($parser, string $tag_name):void
|
||||||
|
{
|
||||||
|
$this->actualTagName = '';
|
||||||
|
$this->xmlReader->tag_close($tag_name);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,48 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace TorstenHettstedt\XmlReader\Sax\Tests\Unit;
|
||||||
|
|
||||||
|
use Codeception\Stub\Expected;
|
||||||
|
use Codeception\Test\Unit;
|
||||||
|
use Exception;
|
||||||
|
use TorstenHettstedt\XmlReader\Sax\XmlReaderInterfaces;
|
||||||
|
use TorstenHettstedt\XmlReader\Sax\XmlSaxParser;
|
||||||
|
|
||||||
|
class XmlSaxParserTest extends Unit
|
||||||
|
{
|
||||||
|
|
||||||
|
const XML_DATA = <<<XML
|
||||||
|
<?xml version = "1.0" encoding = "utf-8"?>
|
||||||
|
<tutors>
|
||||||
|
<course>
|
||||||
|
<name>Android</name>
|
||||||
|
<email>contact@tutorialspoint.com</email>
|
||||||
|
</course>
|
||||||
|
|
||||||
|
<course>
|
||||||
|
<name>Java</name>
|
||||||
|
</course>
|
||||||
|
</tutors>
|
||||||
|
XML;
|
||||||
|
|
||||||
|
protected $xmlReader = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
protected function setUp(): void
|
||||||
|
{
|
||||||
|
parent::setUp();
|
||||||
|
$this->xmlReader = $this->makeEmpty(XmlReaderInterfaces::class, [
|
||||||
|
'tag_open' => Expected::exactly(6),
|
||||||
|
'cdata' => Expected::exactly(3),
|
||||||
|
'tag_close' => Expected::exactly(6),
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testParse()
|
||||||
|
{
|
||||||
|
$reader = new XmlSaxParser($this->xmlReader);
|
||||||
|
$reader->parse(self::XML_DATA);
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user