Определить корневой элемент при разборе SAX - PullRequest
3 голосов
/ 24 ноября 2010

Я использую SAX для разбора файлов XML.Давайте предположим, что я хочу, чтобы мое приложение только обрабатывало XML-файлы с корневым элементом " animalList " - если корневым узлом является что-то другое, анализатор SAX должен прекратить синтаксический анализ.

Используя DOM, вы бы сделали это так:

...
Element rootElement = xmldoc.getDocumentElement();

if ( ! rootElement.getNodeName().equalsIgnoreCase("animalList") )
   throw new Exception("File is not an animalList file.");
...

, но я не могу понять, как это сделать с помощью SAX - я не могу понять, как сказать SAX-парсеропределить корневой элемент.Тем не менее, я знаю, как прекратить анализ в любой точке (после того, как решение Тома ).

Пример XML-файла:

<?xml version="1.0" encoding="UTF-8"?>
<animalList version="1.0">
  <owner>Old Joe</owner>
  <dogs>
    <germanShephered>Spike</germanShephered>
    <australianTerrier>Scooby</australianTerrier>
    <beagle>Ginger</beagle>
  </dogs>
  <cats>
    <devonRex>Tom</devonRex>
    <maineCoon>Keta</maineCoon>
  </cats>
</animalList>

Спасибо.

1 Ответ

4 голосов
/ 24 ноября 2010

Хотя я использовал SAX в прошлый раз много лет назад и не помню наизусть API, но я думаю, что первым тегом, который получает ваш обработчик, является корневой элемент. Итак, вам нужно просто создать логический член класса, который указывает, проверяли ли вы уже первый элемент:

boolean rootIsChecked = false;

Тогда напишите в свой обработчик:

if (!rootIsChecked) {
    if (!"animalList".equals(elementName)) {
       throw new IllegalArgumentException("Wrong root element");
    }
    rootIsChecked = true;
}
// continue parsing...
...