如何使用ANTLR来解析xml文档

时间:2009-11-18 13:51:06

标签: antlr

任何人都可以告诉如何使用ANTLR工具(在java中)为xml文档创建我们自己的语法,以及如何使用ANTLR工具解析这些文档(在java中)?

2 个答案:

答案 0 :(得分:1)

查看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(); }
  ;

答案 1 :(得分:1)

如果要编写完全符合(甚至无法验证)的XML解析器,则必须阅读W3C规范(http://www.w3.org/TR/REC-xml/)。您将需要处理内部和外部DTD子集,参数实体和一般实体。即使使用ANTLR,这也是一项重大任务。您需要能够解析URL并处理namespaceURI。还有更多。

我怀疑你只想解析一个子集(虽然我不认为为标准编写不符合的解析器是个好主意)。在这种情况下,首先要为您的子集编写EBNF。那么它应该是相当简单的: - )

编辑要说清楚:任何不符合完整规范的内容都不是XML。您谈到为XML创建“自己的语法”,但已经有一个定义的XML语法,无法修改。如果你想创建自己的“像XML”这样的语法,但任何认为它实际上都是IS XML的人都会感到失望,因为有很多你不支持的XML结构(或者会支持不同的)。