2009-10-11 23 views
0

我知道很多c/C++ XML庫問題已經被問到(我試圖在讀完之前通讀所有問題)。c/C++ XML庫問題

這裏是我會在我自己的項目所需要的東西:

  • 卓越的性能
  • SAX2
  • 驗證
  • 開源
  • 跨平臺

我打算使用Xerces-C,但是我看到一個簡單的SAX2 s在過濾器中沒有任何東西需要運行5秒鐘。 (也許我在這裏做錯了什麼?)

我想使用libxml ++,但正如我試圖讓它在我的MacBook上設置,有一些瘋狂的依賴,帶我回到gtk- doc,我在這一點上提出了這個想法。

所以現在我在libxml2。這是要走的路嗎?考慮到上面的五個要求,我錯過了一個重要的選擇嗎?我不介意使用像libxml2這樣的(好的)c庫,但是一個C++接口會很好。 (我不太喜歡Xerces-C的API。)

如果可比較的功能可用,我願意在SAX2要求上下功夫。

+0

我也願意使用一個單獨的驗證庫,如果是簡單的構造這樣的DOM;即一個用於SAX2的庫,另一個用於驗證。但是設置不應該太笨拙。 – 2009-10-11 04:56:43

回答

2

在這個問題上花費了大量的時間,這是我的結論,libxml2是您的指導下最好的選擇。 C界面不太難使用,速度非常快。

商業圖書館還有其他一些不錯的選擇,但大多數其他可比較的開源選項要麼非常緩慢,要麼陷入深深而煩人的依賴湯中。

+1

前三大商業選擇是什麼?什麼是取捨? – 2009-10-11 05:06:56

0

如果你需要一大堆其他設施,你可以考慮Qt,它有很好的XML支持。不過要注意的是,它不僅僅是一個XML處理庫。它是一個全面的應用程序框架,支持圖形用戶界面,網絡和其他一系列事物。

Qt

您也可以嘗試波科。這是另一種應用程序框架,但不作爲的Qt作爲巨大的(即沒有GUI相關的東西等)

Poco

最後,如果你不介意一個C庫,你可以使用外籍人士。這本身不是SAX,但使用Expat編寫代碼有點像SAX。它有C++包裝器,但它們並不是IIRC項目的正式組成部分,可能不是很好維護或設計的。但我不太確定。

Expat

希望這有助於!

編輯:我誤解了你原來的文章:不太確定這些庫的驗證功能,我以前從未使用過它們。

+1

我看着Qt並留下了深刻的印象。驗證尚未推出(截至2月),但也許我應該仔細觀察。 IIRC,Expat和Poco都不提供驗證,但否則它們看起來不錯。 – 2009-10-11 04:53:31

1

你說你需要在你的項目中的這些東西,但是不要給管道的任何想法。例如,我們有一大堆需要快速加載的靜態XML文件,但只能很少驗證。因此,批量使用單獨的進程進行了驗證(使用RelaxNG,因爲它是人類可寫的標記),並使用expat加載XML。該系統還使用了XMPP,因此檢查了流式輸入,但這並不需要根據模式進行驗證(部分原因是因爲它是流式傳輸,主要是因爲大多數可能的錯誤都不能在模式中表達)。

+0

管道是一個很好的點。我不需要在同一個應用程序中使用SAX和驗證。我想使用一個通用框架,其中一個應用程序將對小文件進行DOM解析,另一個將處理非常大的文件。如果有可用的話,我只想要一個通用框架。我會檢查你提到的東西。 – 2009-10-11 17:18:53

0

我創建了一個C++ 11 XML解析庫庫(Java的的StAX等)加速許可證。你可以在https://github.com/incoder1/IO找到它。

用於讀取XML成POCO結構的一個例子。

XML:

<?xml version="1.0" encoding="UTF-8"?> 
<configurations> 
    <configuration id="0" enabled="true"> 
     <name>Test configuration <![CDATA[<0>]]></name> 
    </configuration> 
    <configuration id="1" enabled="false"> 
     <name>Test configuration <![CDATA[<1>]]></name> 
    </configuration> 
</configurations> 

而對於像結構的讀取代碼:

static configuration read_config(io::unsafe<io::xml::reader>& rd) { 
    configuration ret; 
    io::xml::start_element_event bev = rd.next_tag_begin(); 
     // read id from attribute 
     io::const_string tmp = bev.get_attribute("id").first; 
     ret.id = size_t_cast::from_string(tmp.data()); 
     tmp = bev.get_attribute("enabled").first; 
     ret.enabled = bool_cast::from_string(tmp.data()); 
     // read name value from tag 
     bev = rd.next_tag_begin(); 
      ret.name = std::string(rd.next_characters().data()); 
     rd.next_tag_end(); 
    // goto </configuration> 
    rd.next_tag_end(); 
    return ret; 
} 

一個完整的例子可以發現

/// A structure to parse into 
struct configuration 
{ 
    std::size_t id; 
    bool enabled; 
    std::string name; 
}; 

甲讀取(解串行化代碼)功能at https://github.com/incoder1/IO/tree/master/examples/xml_read

Java StAX的更復雜的例子,如事件庫XML解析器可以在以下位置找到:https://github.com/incoder1/IO/tree/master/examples/xmlparse

庫需要iconv(像操作系統的POSIX/Unix例如GNU/Linux,FreeBSD,MacOSX將它捆綁到libc中)以及可選的gnutls。 GnuTLS用於最小的網絡支持,可以避免用於XML解析。 在Windows(Windows 7,Windows 10)和GNU/Linux(Fedora 23,Fedora 26)上使用GCC 5+(GNU/Linux和MinGW64)和MS VC++ 15. +進行庫測試

與C SAX類似的解析器不同, ,libxml2 IO是一個C++庫,它也不是基於回調的。 與apache xerces異常不同,rtti可以同時關閉。 與TinyXML的,POCO等沒有DOM支持

解析器僅驗證XML語法。 XSD或DTD上的XML模式驗證尚未完成。

謝謝你。