2010-05-17 132 views
7

這是我需要做的:我需要讀取XML格式的文件,從中提取的元素和它們的值,例如下面的代碼:一個簡單的C XML解析器

<user name="Mark"> 
    <param name="Age" value="21"/> 
    <param name="Country" value="NL"/> 
</user> 

我需要提取:name = Mark,Age = 21和Country = NL。

直到今天我一直在做這個解析手動這是一個痛苦。

現在我不在乎文件是否爲「正確的XML」或所有這一切,我不關心DTD或其他標準XML要求。 我只需要讀取和解析值。

任何人都知道(除了lib eXpat)一​​個庫做這個或代碼來做到這一點? 謝謝!

傑斯

編輯:

是的,我忘了提平臺:Windows和Linux。在普通的C,而不是C++

+2

在詢問圖書館時,您可能希望提及您的平臺,因爲圖書館可能是平臺特定的。 – WhirlWind 2010-05-17 19:11:16

+0

檢查出vtd-xml,它比DOM和SAX使用起來更容易 – 2010-05-17 19:40:22

回答

7
+0

謝謝,我已經檢查了這個和1)它花了我永遠的理解他們想從我(爲了使它工作)和2)它抱怨我沒有DTD,而且我的文件格式不正確。所以,不是一個好的解決方案。 – Jessica 2010-05-17 19:22:21

+0

我在想更多的東西,沿着http://www.codeguru.com/cpp/data/data-misc/xml/article.php/c4549 – Jessica 2010-05-17 19:23:24

+0

行它應該不需要一個DTD,但它確實需要XML格式良好 - 即開始/結束標籤匹配並且沒有非法字符,並且只有一個根元素。如果你的輸入不正確,也許你應該修復它。如果你不需要你的輸入是格式良好的XML,而只需要xml-ish,那麼你可以輕鬆地編寫你自己的解析器:只要搜索「<" & ">」字符就可以將它分解成幾部分,然後解析每一部分。 XML解析器的很多複雜性是因爲它必須將任何通用化的XML解析爲特定的內部模型。 – 2010-05-17 20:29:06

1

如果C++是OK,那麼你可以嘗試TinyXML。我已經使用了它幾年,它很好地工作。

+0

謝謝,但它是純C – Jessica 2010-05-17 19:21:03

+0

公平的不夠...... – 2010-05-17 19:41:44

4

Expat解析器是我遇到的最好的 - 我用它在我的C優先於各種C++解析器++代碼 - 但它是寫在C.非常易於使用並嵌入到您的應用程序中。所以,我不明白爲什麼在你的問題你說:

(比LIB外籍其他)

你有反對的東西嗎?

+0

我的確,我肯定會選擇expat考慮給定的要求。在我能想到的情況下不使用它的唯一原因是,如果海​​報沒有從SAX事件創建數據結構的需求,並且需要DOM? – 2010-05-18 03:24:00

+0

不,我沒有任何反對的東西,事實上我在另一個項目上使用它,但它很大,而且我需要的比我需要的更復雜。所以,正如我非常清楚地指出我的問題,我不會將expat作爲解決方案 – Jessica 2010-05-20 18:32:58

+0

@Jessica您必須擁有您自己的單詞「big」的私人定義 - Expat就像您將要使用的XML解析器一樣小得到。具體而言,它比Mini-XML更小。 – 2010-05-20 19:14:48

4

Mini-XML如何?它的重量輕,用gcc的作品,是ANSI-C兼容...

http://www.minixml.org/index.php

根據該文件,以搜索爲特定的節點將是簡單:

/* Find the first "a" element */ 
    node = mxmlFindElement(tree, tree, "a", 
          NULL, NULL, 
          MXML_DESCEND); 

一旦你得到該節點,您可以根據您的要求操縱它。

+0

謝謝,我已經發布了這個(請參閱我自己的問題答案) – Jessica 2010-05-20 18:31:28