Как использовать ANTLR для разбора XML-документа - PullRequest
0 голосов
/ 18 ноября 2009

Кто-нибудь может рассказать, как использовать инструмент ANTLR (в Java) для создания нашей собственной грамматики для XML-документов и как анализировать эти документы с помощью инструмента ANTLR (в Java)?

Ответы [ 2 ]

1 голос
/ 20 ноября 2009

Если вы хотите написать полностью соответствующий (даже не проверяющий) синтаксический анализатор XML, вы должны прочитать спецификацию W3C (http://www.w3.org/TR/REC-xml/).). Вам потребуется иметь дело с внутренними и внешними подмножествами DTD, объектами параметров и общими объектами. Это будет серьезной задачей, даже с ANTLR. Вам нужно будет уметь разрешать URL-адреса и работать с namespaceURI. И многое другое.

Я подозреваю, что вы хотите проанализировать только подмножество (хотя я не думаю, что было бы хорошей идеей написать несовместимые парсеры для стандартов). В этом случае первым делом нужно написать EBNF для вашего подмножества. Тогда это должно быть довольно просто: -)

РЕДАКТИРОВАТЬ Чтобы было очень ясно: все, что не соответствует полной спецификации, НЕ является XML. Вы говорите о создании своей «собственной грамматики» для XML, но для XML уже существует определенная грамматика, которую нельзя изменить. Если вы хотите создать свой собственный синтаксис, «похожий на XML», вы можете это сделать, но любой, кто думает, что это действительно XML, будет разочарован, поскольку существует множество XML-конструкций, которые вы не будете поддерживать (или будете поддерживать по-другому).

1 голос
/ 19 ноября 2009

Проверьте ANTXR, мой ANTLR-вывод, который поддерживает XML-теги в самой грамматике. Вы можете использовать SAX или XMLPull в качестве внешнего интерфейса. (Примечание: он основан на ANTLR 2.x)

http://javadude.com/tools/antxr/index.html

Краткий пример:

header {
package com.javadude.antlr.sample.xml;

import java.util.List;
import java.util.ArrayList;
}

class PeopleParser extends Parser;


document returns [List results = null]
  : results=<people> EOF
  ;

<people> returns [List results = new ArrayList()]
  { Person p; }
  : ( p=<person>  { results.add(p); }   )*
  ;

<person> returns [Person p = new Person()]
  {
    String first, last;
    p.setId(@id);  // attributes are read using "@xxxx"
  }
  : ( first=<firstName>  { p.setFirstName(first); }
    | last=<lastName>    { p.setLastName(last);   }
    )*
  ;

<firstName> returns [String value = null]
  : pcdata:PCDATA { value = pcdata.getText(); }
  ;

<lastName> returns [String value = null]
  : pcdata:PCDATA { value = pcdata.getText(); }
  ;
...