public function readEntity(RoutingContextInterface $context, \ReflectionClass $ref, &$isRead)
 {
     if ($ref->name !== \DOMDocument::class) {
         return;
     }
     $request = $context->getRequest();
     if (!$request->hasEntity()) {
         return;
     }
     $isRead = true;
     $builder = new XmlDocumentBuilder();
     return $builder->buildFromSource($request->getEntity()->getContents());
 }
 /**
  * Compile the given XML source and return a compiler object.
  * 
  * @param string $data
  * @return ExpressCompiler
  */
 protected function parseView(ExpressViewRenderer $renderer, $data, $resource = '')
 {
     try {
         // This ugly pre-processing is neccessary due to DOM XML forgetting about self-closing elements.
         $reader = new XmlStreamReader();
         $reader->XML($data);
         $buffer = '<?xml version="1.0"?>' . "\n";
         while ($reader->read()) {
             switch ($reader->nodeType) {
                 case XmlStreamReader::ELEMENT:
                     $buffer .= '<' . $reader->name;
                     $namespaces = [];
                     while ($reader->moveToNextAttribute()) {
                         if ($reader->namespaceURI == self::NS_XML) {
                             switch ($reader->localName) {
                                 case 'nsdec':
                                 case 'empty':
                                     continue 2;
                             }
                         }
                         if ($reader->namespaceURI == self::NS_XMLNS) {
                             $namespaces[$reader->name] = $reader->value;
                         }
                         $buffer .= ' ' . $reader->name . '="' . htmlspecialchars($reader->value, ENT_COMPAT | ENT_XML1 | ENT_SUBSTITUTE, 'UTF-8') . '"';
                     }
                     $reader->moveToElement();
                     if (!empty($namespaces)) {
                         $encoded = base64_encode(json_encode($namespaces, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE));
                         $buffer .= ' xml:nsdec="' . htmlspecialchars($encoded, ENT_QUOTES | ENT_XML1 | ENT_SUBSTITUTE, 'UTF-8') . '"';
                     }
                     if ($reader->isEmptyElement) {
                         $buffer .= ' xml:empty="" />';
                     } else {
                         $buffer .= '>';
                     }
                     break;
                 case XmlStreamReader::END_ELEMENT:
                     $buffer .= '</' . $reader->name . '>';
                     break;
                 case XmlStreamReader::SIGNIFICANT_WHITESPACE:
                 case XmlStreamReader::TEXT:
                 case XmlStreamReader::WHITESPACE:
                     $buffer .= htmlspecialchars($reader->value, ENT_QUOTES | ENT_XML1 | ENT_SUBSTITUTE, 'UTF-8');
                     break;
             }
         }
         // Parse XML buffer into a DOM document.
         $builder = new XmlDocumentBuilder();
         $xml = $builder->buildFromSource($buffer);
         $compiler = new ExpressCompiler($renderer);
         $compiler->setResource($resource);
         $parser = new ExpressViewParser();
         $view = $parser->parseSource($xml);
         $view->compile($compiler);
         return $compiler;
     } catch (\Exception $e) {
         $ex = $e;
         do {
             if ($ex instanceof ExpressViewException) {
                 if ($ex->getErrorFile() === NULL) {
                     $ex->setErrorFile($resource);
                 }
             }
         } while ($ex = $ex->getPrevious());
         throw $e;
     }
 }