2012-04-30 33 views
1

我一直在使用C++和Xerces-c處理XML解析器,但我似乎遇到了一個我無法弄清的問題(不是主要的的問題,我可以得到一個解決辦法,但不想「黑客」,圍繞我的方式:))C++ Xerces-c - 如何判斷節點是否佔位符

我有這樣

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<Config> 
<Person> 
    <Title>Mr.</Title> 
    <Forename>Stephen</Forename> 
    <Surname>Cassidy</Surname> 
    <Job> 
     <Title>Position1</Title> 
     <Position>Worker</Position> 
     <Salary>£6.40</Salary> 
    </Job> 
    <Job> 
     <Title>NewJob</Title> 
     <Position>PositionWorker1</Position> 
     <Position>AnotherPosition</Position> 
     <Salary>£12,000</Salary> 
    </Job> 
</Person> 

一個XML文件,我試圖要做的是弄清楚節點是否只是其他子節點的「佔位符」,例如如<Person>節點或<Job>節點,只需檢查它的子節點,而不嘗試任何處理。

原因是我將節點值存儲在一個存儲節點名稱(例如標題)和值(例如NewJob)的類中,以及子條目列表中,所以Job將是一個節點條目,那麼標題,職位和薪資將全部是Job的「子」條目。不過,我希望能夠檢查Job是否已經有位置條目,而不是創建新條目並將其添加到Job中,只需將Position的值添加到已存在的Position條目中即可感覺任何人:)

任何幫助將不勝感激,我不希望任何人爲我編寫它或任何東西只是一些提示或指針:)!

+0

爲什麼你將節點存儲在自己的類中? Xerces爲此提供結構。一般來說,我會考慮檢查每個子項的名稱並返回節點,如果它是'位置'。 – lupz

回答

0

我建議在這種情況下使用SAX解析器。如果您構建自己的對象,則不需要創建DOM,並且可以在SAX運行期間輕鬆地填充自己的對象。這將減少內存消耗,並且在處理大型文件時可能會快得多。

基本上,使用SAX解析器是

SAX2XMLReaderImpl* sax_parser = new SAX2XMLReaderImpl(); 
MyDefaultHandler* docHandler = new MyDefaultHandler(); // derived from DefaultHandler 

sax_parser->setContentHandler(docHandler); 
sax_parser->parse(pszPath); 

序列中的SAX接口的詳細文檔可以在這裏找到: SAX2XMLReader

您將通過您的MyDefaultHandler實施的回調被稱爲類,而Xerces解析XML。根據您的需要填寫您的物件。

希望這會有所幫助。

+0

這可以使用DOM解析器完成。解析器通常會標記不同類型的節點(例如text-nodes/plain-char-data-nodes)。 – dirkgently

+0

當然,他們(DOM解析器)正在這樣做。但是,如果創建自己的數據結構,爲什麼還要創建一個DOM樹。沒有更多的信息,我從給出的原始問題中獲取這個事實,因此最好不要創建一個DOM樹。 – Clemens

+0

我對OP問題的解讀是相反的:我認爲他正在使用DOM解析器。 – dirkgently

0

Job應該有類型ELEMENT_NODE而另一個應該有類型TEXT_NODE。您可以使用getNodeType()成員來檢查類型,然後根據需要繼續。

+0

嗯我曾試過,但由於某種原因是作爲一個ELEMENT_NODE,然後它顯示爲一個TEXT_NODE後的空白,所以在我的代碼中它正在處理爲包含一個值的節點:S這不是一個大問題,因爲我提出了一個解決方法,但是很好地理解它,而不是使用黑客:P – KingTravisG

+0

@ SCassidy1986:這是因爲解析器是保留空白處理。這種行爲很可能會被關閉。你可以試試'DocumentHandler :: ignorableWhitespace()'嗎? – dirkgently

+0

我仍然相信使用SAX解析器這個任務會更容易;-) – Clemens

相關問題