Fixed Schedule XML parser to support minimum import

This commit is contained in:
Igor Scheller 2020-04-06 21:11:19 +02:00 committed by msquare
parent 2fab7ba39a
commit f3af7bab50
5 changed files with 98 additions and 8 deletions

View File

@ -34,6 +34,8 @@ class XmlParser
/** /**
* Parse the predefined XML content * Parse the predefined XML content
*
* According to https://github.com/voc/voctosched/blob/master/schema/basic.xsd
*/ */
protected function parseXml(): void protected function parseXml(): void
{ {
@ -93,9 +95,9 @@ class XmlParser
$attachments = $this->getListFromSequence($event, 'attachments', 'attachment', 'href'); $attachments = $this->getListFromSequence($event, 'attachments', 'attachment', 'href');
$recording = ''; $recording = '';
$recordingElement = $event->xpath('recording')[0]; $recordingElement = $event->xpath('recording');
if ($this->getFirstXpathContent('optout', $recordingElement) == 'false') { if ($recordingElement && $this->getFirstXpathContent('optout', $recordingElement[0]) == 'false') {
$recording = $this->getFirstXpathContent('license', $recordingElement); $recording = $this->getFirstXpathContent('license', $recordingElement[0]);
} }
$events[] = new Event( $events[] = new Event(
@ -155,9 +157,11 @@ class XmlParser
): array { ): array {
$items = []; $items = [];
foreach ($element->xpath($firstElement)[0]->xpath($secondElement) as $item) { foreach ($element->xpath($firstElement) as $element) {
foreach ($element->xpath($secondElement) as $item) {
$items[(string)$item->attributes()[$idAttribute]] = (string)$item; $items[(string)$item->attributes()[$idAttribute]] = (string)$item;
} }
}
return $items; return $items;
} }

View File

@ -0,0 +1,47 @@
<?xml version='1.0' encoding='utf-8' ?>
<schedule
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="https://raw.githubusercontent.com/voc/voctosched/master/schema/basic.xsd"
>
<version>dolor</version>
<conference>
<title>Basic Test Event</title>
<acronym>Test2</acronym>
<start>2042-01-03</start>
<end>2042-01-03</end>
<days>1</days>
<timeslot_duration>00:30</timeslot_duration>
</conference>
<day index='1' date='2042-01-03' start='2042-01-03T01:00:00+02:00' end='2042-01-03T22:59:00+02:00'>
<room name='Some Room'>
<event guid='7b1327a5-049b-4411-8421-163743755933' id='1234'>
<date>2042-01-03T14:15:00+02:00</date>
<title>Lorem Ipsum</title>
<subtitle>Some sub</subtitle>
<start>14:15</start>
<duration>00:45</duration>
<room>Some Room</room>
<slug>lorem/ipsum</slug>
<recording>
<license>WTFPL</license>
<optout>true</optout>
</recording>
<track>Tests</track>
<type>Talk</type>
<language>en</language>
<abstract>45 minutes of awesome lorem ipsum</abstract>
<description>Be prepared for the best lorem ipsum of the entire day!</description>
<logo>https://lorem.ipsum/foo/bar.png</logo>
<persons>
<person id='42'>Some Person</person>
</persons>
<links>
<link href="https://foo.bar">Some Foo Bar</link>
</links>
<attachments>
<attachment href="https://foo.bar/stuff.pdf">A PDF File</attachment>
</attachments>
</event>
</room>
</day>
</schedule>

View File

@ -1,9 +1,12 @@
<?xml version='1.0' encoding='utf-8' ?> <?xml version='1.0' encoding='utf-8' ?>
<schedule> <schedule
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="https://raw.githubusercontent.com/voc/voctosched/master/schema/extended.xsd"
>
<version>Some version string</version> <version>Some version string</version>
<conference> <conference>
<title>Test Event</title> <title>Test Event</title>
<acronym>Test1</acronym> <acronym>Test3</acronym>
<start>2042-01-01</start> <start>2042-01-01</start>
<end>2042-01-01</end> <end>2042-01-01</end>
<days>1</days> <days>1</days>
@ -24,6 +27,7 @@
<license>WTFPL</license> <license>WTFPL</license>
<optout>false</optout> <optout>false</optout>
</recording> </recording>
<video_download_url>https://foo.bar/baz/schedule/ipsum/recording.mp4</video_download_url>
<track>Testing</track> <track>Testing</track>
<type>Talk</type> <type>Talk</type>
<language>de</language> <language>de</language>

View File

@ -0,0 +1,27 @@
<schedule>
<version>0.0.1</version>
<conference>
<title>Some Test Event</title>
<acronym>Test1</acronym>
</conference>
<day index='1' date='2042-01-02' start='2042-01-02T00:00:00+00:00' end='2042-01-02T22:59:00+00:00'>
<room name='Random Room'>
<event guid='023eb047-5a42-41e0-b1ec-e9fab19b2987' id='42'>
<date>2042-01-02T13:30:00+00:00</date>
<title>Minimum Setup Test</title>
<subtitle>With a subtitle</subtitle>
<start>13:30</start>
<duration>00:30</duration>
<room>Rooming</room>
<slug>minimum-setup-test</slug>
<track>Testing</track>
<type>Talk</type>
<abstract>A minimal description</abstract>
</event>
</room>
<room name='Another Room'>
</room>
</day>
<day index='2' date='2042-01-03' start='2042-01-03T00:00:00+00:00' end='2042-01-03T22:59:00+00:00'>
</day>
</schedule>

View File

@ -24,8 +24,15 @@ class XmlParserTest extends TestCase
libxml_use_internal_errors(true); libxml_use_internal_errors(true);
$parser = new XmlParser(); $parser = new XmlParser();
// Invalid XML
$this->assertFalse($parser->load('foo')); $this->assertFalse($parser->load('foo'));
$this->assertTrue($parser->load(file_get_contents(__DIR__ . '/Assets/schedule.xml'))); // Minimal import
$this->assertTrue($parser->load(file_get_contents(__DIR__ . '/Assets/schedule-minimal.xml')));
// Basic import
$this->assertTrue($parser->load(file_get_contents(__DIR__ . '/Assets/schedule-basic.xml')));
// Extended import
$this->assertTrue($parser->load(file_get_contents(__DIR__ . '/Assets/schedule-extended.xml')));
$schedule = $parser->getSchedule(); $schedule = $parser->getSchedule();
$this->assertEquals('Some version string', $schedule->getVersion()); $this->assertEquals('Some version string', $schedule->getVersion());
@ -50,5 +57,6 @@ class XmlParserTest extends TestCase
$this->assertEquals('de', $event->getLanguage()); $this->assertEquals('de', $event->getLanguage());
$this->assertEquals('12:30', $event->getStart()); $this->assertEquals('12:30', $event->getStart());
$this->assertEquals([1234 => 'Some Person'], $event->getPersons()); $this->assertEquals([1234 => 'Some Person'], $event->getPersons());
$this->assertEquals('https://foo.bar/baz/schedule/ipsum/recording.mp4', $event->getVideoDownloadUrl());
} }
} }