=> Главная База Знаний Xslt Обработка ошибок разбора


Обработка ошибок разбора

Обработка ошибок разбора

При использовании JavaScript для загрузки документов XML и XSL и работы с ними важно знать, как сообщать об ошибках разбора. В предыдущем примере я сообщал об ошибках, выводя сообщение «Error!» в элементе-приемнике

<DIV>
документа HTML, но это не очень информативно. Как получить дополнительную информацию? 

В следующем примере я намерено создаю ошибку разбора, изменив первый тег

<PLANET>
в
planets.xml
на тег
<PLANETS>
:

<?xml version="1.0"?>

<?xml-stylesheet type="text/xml" href="/planets.xsl"?>

<PLANETS>

 <PLANETS>

  <NAME>Mercury</NAME>

  <MASS UNITS="(Earth = 1)">.0553</MASS>

  <DAY UNITS="days">58.65</DAY>

  <RADIUS UNITS="miles">1516</RADIUS>

  <DENSITY UNITS="(Earth = 1)">.983</DENSITY>

  <DISTANCE UNITS="million miles">43.4</DISTANCE><!--B перигелии-->

 </PLANET>

 .

 .

 .

Я установил свойство

validateOnParse
объекта
XMLDocument
в
true
(значение по умолчанию —
false
, что означает отсутствие проверки), поэтому процессор MSXML отловит эту ошибку разбора. Объект
XMLDocument
содержит объект
parseError
, и если его свойство
errorCode
не равно нулю, это означает наличие ошибки. Сейчас я хочу не просто вывести сообщение «Error!», а расшифровать ошибку при помощи новой функции
getError
, которая возвращает строку с информацией о месте и причине ошибки.

С целый получения этой дополнительной информации я использую свойства <url, line, linepos и reason объекта parseError для того, чтобы определить вызвавший проблему файл, строку, позицию ошибки и ее описание (листинг 10.1). 

Листинг 10.1. Создание преобразования XSLT и отображение ошибок разбора

<HTML>

 <HEAD>

  <TITLE>XSLT Using JavaScript</TITLE>

   <SCRIPT LANGUAGE="JavaScript">

    function xslt() {

    var XMLDocument = new ActiveXObject('MSXML2.DOMDocument.3.0');

    var XSLDocument = new ActiveXObject('MSXML2.DOMDocument.3.0');

    var HTMLtarget = document.all['targetDIV'];

    XMLDocument.validateOnParse = true;

    XMLDocument.load('planets.xml');

    if (XMLDocument.parseError.errorCode != 0) {

     HTMLtarget.innerHTML = getError(XMLDocument);

     return false;

    }

    XSLDocument.validateOnParse = true;

    XSLDocument.load('planets.xsl');

    if (XSLDocument.parseError.errorCode != 0) {

     HTMLtarget.innerHTML = getError(XSLDocument);

     return false;

    }

    HTMLtarget.innerHTML = XMLDocument.transformNode(XSLDocument);

    return true;

   }


   function getError(errorObject) {

    var Error = new String;

    Error = "Error. " + errorObject.parseError.url + "<BR>" +

     "Line: " + errorObject.parseError.line + "<BR>" +

     "Character: " + errorObject.parseError.linepos + "<BR>" +

     "Description: " + errorObject.parseError.reason;

    return Error;

   }

  </SCRIPT>

 </HEAD>

 <BODY onload="xslt()">

  <DIV ID="targetDIV">

  </DIV>

 </BODY>

</HTML>

Результат можно увидеть на 2, где показаны вызвавший ошибку файл, место ошибки и описание ошибки процессором MSXML. Если вы собираетесь реализовывать преобразования XSLT в Internet Explorer, когда пользователи просматривают ваши документы случайным образом, обработка подобных ошибок разбора исключительно важна.

Обработка ошибок разбора

2. Обработка ошибки разбора


Пока что я преобразовывал при помощи процессора MSXML только документ целиком, но здесь у вас существует значительно больше возможностей. Например, в следующем разделе я воспользуюсь XSLT в Internet Explorer для сортировки данных планет в HTML-таблицы по нажатию кнопок. Для этого я буду обращаться к отдельным узлам внутри таблицы стилей.