public static function validateXML($string, &$errors, $encoding = 'UTF-8') { $xsl = '<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"></xsl:template> </xsl:stylesheet>'; $xml = trim($string); if (strpos($string, '<?xml') === false) { $xml = sprintf('<?xml version="1.0" encoding="%s"?><rootelement>%s</rootelement>', $encoding, $string); } XSLProc::transform($xml, $xsl); if (XSLProc::hasErrors()) { $errors = XSLProc::getErrors(); return false; } return true; }
public static function render($e) { $xml = new DOMDocument('1.0', 'utf-8'); $xml->formatOutput = true; $root = $xml->createElement('data'); $xml->appendChild($root); $details = $xml->createElement('details', $e->getMessage()); $details->setAttribute('type', $e->getType() == XSLProc::ERROR_XML ? 'XML' : $e->getFile()); $details->setAttribute('file', General::sanitize($e->getFile())); $details->setAttribute('line', $e->getLine()); $root->appendChild($details); $nearby_lines = self::__nearByLines($e->getLine(), $e->getFile(), $e->getType() == XSLProc::ERROR_XML, 6); $lines = $xml->createElement('nearby-lines'); $markdown .= "\t" . $e->getMessage() . "\n"; $markdown .= "\t" . $e->getFile() . " line " . $e->getLine() . "\n\n"; foreach ($nearby_lines as $line_number => $string) { $markdown .= "\t{$string}"; $string = trim(str_replace("\t", ' ', General::sanitize($string))); $item = $xml->createElement('item'); $item->setAttribute('number', $line_number + 1); $cdata = $xml->createCDATASection(strlen($string) == 0 ? ' ' : $string); $item->appendChild($cdata); $lines->appendChild($item); } $root->appendChild($lines); $element = $xml->createElement('markdown'); //, General::sanitize($markdown))); $element->appendChild($xml->createCDATASection($markdown)); $root->appendChild($element); $processing_errors = $xml->createElement('processing-errors'); if (XSLProc::getErrors() instanceof MessageStack) { foreach (XSLProc::getErrors() as $error) { $error->file = str_replace(WORKSPACE . '/', NULL, $error->file); $item = $xml->createElement('item', trim(General::sanitize($error->message))); if (strlen(trim($error->file)) == 0) { $item->setAttribute('file', General::sanitize($error->file)); } if (strlen(trim($error->line)) == 0) { $item->setAttribute('line', $error->line); } $processing_errors->appendChild($item); } } $root->appendChild($processing_errors); return parent::__transform($xml, 'exception.xslt.xsl'); }