簡體   English   中英

在沒有其他庫的情況下,在標准C / C ++中解析XML

[英]Parse an XML in standard C/C++ without additional libraries

我有一個XML(假設它是有效的),我必須解析它並將其存儲在樹中。

解析它的最佳方法是什么,不使用其他庫,只是對字符串進行基本操作?

請記住,我不必驗證它,只需將其解析並記憶到樹中。

XML的基本結構非常簡單:

<tagname [attribute[="value"] ...]>content</tagname>

內容可能包含普通文本和更多XML結構,或特殊形式

<tagname [attribute[="value"] ...]/>

這相當於

<tagname [attribute[="value"] ...]></tagname>

那是,。 空的內容。

因此,如果您不需要解釋DTD或做其他奇特的事情,您可以執行以下操作:

  1. 檢查第一個非空白字符是否為< 如果沒有,您沒有XML,只能給出錯誤並退出。

  2. 現在跟隨標記名稱,直到第一個空格或/>字符。 存儲它。

  3. 如果下一個非空白字符是/ ,請檢查它后面是否> 如果是這樣,您已經完成解析並可以返回結果。 否則,您的XML格式不正確,並且可以退出並顯示錯誤。

  4. 如果字符是> ,那么您已找到begin標記的結尾。 現在遵循內容。 繼續第6步。

  5. 否則以下是一個論點。 解析,存儲結果,然后在步驟3繼續。

  6. 閱讀內容,直到找到<字符。

  7. 如果該字符后跟/ ,那么它就是結束標記。 檢查它后面跟着標簽名稱和> ,如果是,則返回結果。 否則,拋出一個錯誤。

  8. 如果你到了這里,你就找到了嵌套XML的開頭。 使用此算法解析,然后在6處繼續。

閱讀XML看起來很簡單,但正確地執行它會涉及一些您並不真正想要處理的復雜問題。 實際上,編寫一個簡單的XML解析器實際上相當於創建另一個XML庫。 我已經完成了它,並且這個版本的不完整版本位於我的磁盤上。 即使您不需要驗證XML結構:

  • 無論您是否驗證,您都需要處理實體引用,例如&lt; 和各種各樣的字符實體引用,如&#65; &#xa;
  • XML文檔的簡單主體相對簡單,但標題是一個特別是DTD處理的主要問題:有兩個版本略有不同,您可能需要處理內聯DTD
  • 由於這些惱人的角色數據段,甚至身體也不是完全無足輕重的
  • 即使沒有驗證,您可能需要支持外部實體引用
  • 對於XML的各個部分要接受和/或拒絕的字符也有些有趣
  • 請注意,XML是根據Unicode定義的,對此的正確處理也不是完全無關緊要的:只使用charwchar_t只是不會削減它。

我實現的第一個版本是一個很好的小迭代器,旨在彈出遇到的所有元素。 這允許在迭代器用戶選擇時輕松停止並繼續解析的好功能。 不幸的是,當我嘗試使用各種實體引用進行復制時,我沒有得到它。 它會很好地解析簡單的XML文件,但是規范中的一些怪癖我只是沒有做對。

對我來說最有效的是創建一個簡單的遞歸式解析器,並結合適當的緩沖區堆棧,以稍微透明地處理實體引用。 但是,為了完全完成這個,我仍然需要處理一些編碼問題,最后我只有更高優先級的項目(在我的業余時間,即)。

總之:顯然,它可以像其他人那樣完成。 這可能是一個毫無意義的練習,除非你有一個非常聰明的想法,這使你的實現比其他選擇更適合。

最好也是唯一的方法是從頭開始重新實現這樣的庫而不使用任何其他庫...

例如,歡迎您使用像pugixml這樣的現有庫。 它的安裝就像將文件添加到項目並開始使用一樣簡單。 與其他驗證解析器相比,它是輕量級的,例如Xerces。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM