手動解析文件很快變得非常棘手。 你可能想看看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。
製作自定義XML閱讀器是很多工作。你爲什麼不使用其中一個內置的? –
我是C++新手,並不知道里面有內置的。我可以從哪裏得到關於這方面的信息? – KOB
做一個谷歌搜索C++ xml解析器。 –