2015-11-05 37 views
1

我正在編寫一個搜索文件的程序,並且每次遇到'<'字符時,它都會複製它並且每個在字符後面跟着一個字符串,直到達到'>'。到目前爲止,這是我做了什麼:在文件中搜索令牌並將其後的每個字符複製到一個字符串中,直到找到另一個令牌

while(!file.eof()){ 
    char c; 
    string tag; 

    file.get(c); 

    if(c == '<'){ 

     tag_num++; 
     tag += c; 
    }  
} 

如何我現在可以繼續file.get(c),將每個字符tag直到達到「>」?

我的想法,我似乎無法得到的要努力,是對是否環路將包括另一file.get(c)並且每個字符會被複制到tag內添加while(file.get(c) != '>')循環。

+0

製作自定義XML閱讀器是很多工作。你爲什麼不使用其中一個內置的? –

+0

我是C++新手,並不知道里面有內置的。我可以從哪裏得到關於這方面的信息? – KOB

+0

做一個谷歌搜索C++ xml解析器。 –

回答

1

手動解析文件很快變得非常棘手。 你可能想看看recursive descent parser

這是一種模式,它包含通過使函數以遞歸方式解碼每個元素來實現文件的語法。

讓我們舉一個簡單的例子有一個簡單的XML語法(在BNF form):

element ::= '<'<tag>'/>'|'<'<tag>'>'<content>'<'<tag>'/>' 
content ::= <element>|<freetext>|<freetext><element> 
freetext ::= [^<>]<freetext> 
tag ::= <alpha>|<alpha><alphanum> 
alpha ::= [a-zA-Z] 
alphanum ::= [a-zA-Z0-9] 

(我覺得[...]語法的正則表達式是不是BNF的一部分,但它更簡單,我不是寫下來的所有字母:-) [^<]表示任何不是<的字符,它們將與XML中標籤的開頭髮生衝突)

該語法描述了一個元素。一個元素由一個自閉標籤(例如:<br/>)或一個開始標籤,後跟一個內容,然後是一個結束標籤組成。 內容可以是一個元素(因此使用前一個元素的遞歸定義),一些自由文本或一些隨後是元素的自由文本。等等......

解析然後可以機械地執行:

Element parse_element(char *c) 
{ 
    Element myElement; // Element contains the result of the parsing 
         // It's a type you have to define ! 
    assert(*c == '<'); // Handle the error in a more clever way :-) 
    c++; 
    Tag myTag = parse_tag(c); 
    if(*c == '/') 
    { 
     // Self-closing tag - add myTag to myElement 
     c++; 
     assert(*c == '>'); // Here again, better error handling 
     c++; 
    } 
    else 
    { 
     // Or a start tag 
     assert(*c == '>'); // Here again, better error handling 
     c++; 
     Content myContent = parse_content(c); 
     // Add myTag with myContent to myElement 
     assert(*c == '/'); // Here again, better error handling 
     c++; 
     assert(*c == '>'); // Here again, better error handling 
     c++; 
    } 
    return myElement; 
} 

我希望這個功能足以讓這個概念的想法。要理解的要點是,你首先需要有一個明確的語法格式來讀取定義的。然後,你可以機械地實現解析器。

請注意,這個例子太簡單了:您至少需要處理實體,屬性等來解析真正的XML。

有一些工具,例如GNU Bison,一旦有了語法,就可以輕鬆編寫代碼。

最後,如註釋中所述,如果您想分析XML文件,則存在一些XML解析器,如libxml。這比實現你自己的解析器要容易得多,而且要完整得多。 XML is a very complex format

+0

你是對的我改變了它。我認爲這5個XML實體是被禁止的,但事實上只有'<和'&嚴格來說是非法的,''''''''和'''可以出現在這個例子中,爲了簡單起見,我只討論了'<' and '>'如果我們添加實體,'&'變得必要。 –

相關問題