hi foo foo & bar BLA; $reader = new Reader(); $reader->elementMap = [ '{http://sabredav.org/ns}struct' => function(Reader $reader) { return keyValue($reader, 'http://sabredav.org/ns'); } ]; $reader->xml($input); $output = $reader->parse(); $this->assertEquals([ 'name' => '{http://sabredav.org/ns}root', 'value' => [ [ 'name' => '{http://sabredav.org/ns}struct', 'value' => [ 'elem1' => null, 'elem2' => 'hi', '{http://sabredav.org/another-ns}elem3' => [ [ 'name' => '{http://sabredav.org/another-ns}elem4', 'value' => 'foo', 'attributes' => [], ], [ 'name' => '{http://sabredav.org/another-ns}elem5', 'value' => 'foo & bar', 'attributes' => [], ], ] ], 'attributes' => [], ] ], 'attributes' => [], ], $output); } /** * @expectedException \Sabre\Xml\LibXMLException */ function testKeyValueLoop() { /** * This bug is a weird one, because it triggers an infinite loop, but * only if the XML document is a certain size (in bytes). Removing one * or two characters from the xml body here cause the infinite loop to * *not* get triggered, so to properly test this bug (Issue #94), don't * change the XML body. */ $invalid_xml = ' NONE ENVELOPE 1 DC NONE ENVELOPE 1 DC/FleetType> '; $reader = new Reader(); $reader->xml($invalid_xml); $reader->elementMap = [ '{}Package' => function($reader) { $recipient = []; // Borrowing a parser from the KeyValue class. $keyValue = keyValue($reader); if (isset($keyValue['{}WeightOz'])){ $recipient['referenceId'] = $keyValue['{}WeightOz']; } return $recipient; }, ]; $reader->parse(); } }