2009-11-18 115 views
0

任何人都可以告訴如何使用ANTLR工具(在Java中)來創建我們自己的XML文檔語法以及如何使用ANTLR工具(在Java中)解析這些文檔?如何使用ANTLR解析XML文檔

+0

是否有任何理由你想使用ANTLR而不是XML解析器? – 2009-11-18 13:56:41

+0

我想爲xml文檔創建自己的語法,並且還想構建解析器來解析這些文檔。如果有任何替代工具可以使任務更簡單? – Madhan 2009-11-18 14:07:38

回答

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

如果你想寫一個完全符合(甚至非驗證)的XML解析器,您必須閱讀W3C規範(http://www.w3.org/TR/REC-xml/)。您將需要處理內部和外部DTD子集,參數實體和一般實體。即使在ANTLR,這將是一項重大任務。您需要能夠解析URL並處理namespaceURIs。還有更多。

我懷疑你只想解析一個子集(儘管我不認爲爲標準編寫不一致的解析器是個好主意)。在這種情況下,首先要爲您的子集編寫EBNF。那麼它應該是相當直接的:-)

編輯要說得很清楚:任何不符合完整規範的不是XML。你談論的是爲XML創建「自己的語法」,但是已經有一個定義的XML語法,它不能被修改。如果您希望創建自己的「像XML一樣的語法」,但任何人認爲它實際上是XML的話都會被拒絕,因爲有許多XML構造不支持(或者會有不同的支持)。