2013-07-22 83 views
0

我有一個使用xerces庫將數據寫入xml文件的C++程序。任何人都可以幫助我使用相同的xerces庫解析(讀取)xml文件中的屬性值嗎?使用xerces讀取xml屬性的值

我得到了下面的程序,據稱爲服務宗旨:

#include <xercesc/sax2/SAX2XMLReader.hpp> 
#include <xercesc/sax2/XMLReaderFactory.hpp> 
#include <xercesc/sax2/DefaultHandler.hpp> 
#include <xercesc/util/XMLString.hpp> 
#include <conio.h> 
#include <xercesc/parsers/SAXParser.hpp> 
#include <xercesc/sax/HandlerBase.hpp> 
#include <xercesc/util/XMLString.hpp> 
#include <iostream> 
#include <xercesc/dom/DOM.hpp> 
#include <xercesc/parsers/XercesDOMParser.hpp> 
using namespace std; 
using namespace xercesc; 


class ErnstSax2Handler : public DefaultHandler 
{ 
    public: 
    ErnstSax2Handler(void); 
    virtual ~ErnstSax2Handler(void); 

    void startElement(
    const XMLCh* const uri, 
    const XMLCh* const localname, 
    const XMLCh* const qname, 
    const Attributes&  attrs 
    ); 
    void endElement(
    const XMLCh* const uri, 
    const XMLCh* const localname, 
    const XMLCh* const qname 
    ); 
    void characters(
    const XMLCh* const chars, 
    const XMLSize_t  length 
    ); 

    void fatalError(const SAXParseException&); 

    protected: 
    // define variables to save the state 
}; 

void ErnstSax2Handler::startElement(const XMLCh* const uri, 
        const XMLCh* const localname, 
        const XMLCh* const qname, 
        const Attributes&  attrs) 
{ 
    char* name = XMLString::transcode(localname); 
    cout<<name; 
    // ... 
    XMLString::release(&name); 
} 
void ErnstSax2Handler::endElement(
      const XMLCh* const uri, 
      const XMLCh* const localname, 
      const XMLCh* const qname) 
{ 
    char* name = XMLString::transcode(localname); 

    //... 
    XMLString::release(&name); 
} 
void ErnstSax2Handler::fatalError(const SAXParseException& exception) 
{ 
    char* message = XMLString::transcode(exception.getMessage()); 
    cout << "Fatal Error: " << message 
     << " at line: " << exception.getLineNumber() 
     << endl; 
    XMLString::release(&message); 
} 
void ErnstSax2Handler::characters(
const XMLCh* const chars, 
const XMLSize_t  length 
) 
{ 
// This is called when the parser is reading text. 
// You will need to save what state you are in via 
// startElement/endElement. 
} 


int main() { 

    try { 
     XMLPlatformUtils::Initialize(); 
    } 
    catch (const XMLException& toCatch) { 
     char* message = XMLString::transcode(toCatch.getMessage()); 
     cout << "Error during initialization! :\n"; 
     cout << "Exception message is: \n" 
     << message << "\n"; 
     XMLString::release(&message); 
     return 1; 
    } 

    char* xmlFile = "test.xml"; 
    SAX2XMLReader* parser = XMLReaderFactory::createXMLReader(); 
    parser->setFeature(XMLUni::fgSAX2CoreValidation, true); 
    parser->setFeature(XMLUni::fgSAX2CoreNameSpaces, true); // optional 

    DefaultHandler* defaultHandler = new DefaultHandler(); 
    xercesc::ContentHandler* h = new DefaultHandler(); 

    parser->setContentHandler(h); 
    parser->setErrorHandler(defaultHandler); 

    try { 
     parser->parse(xmlFile); 
    } 
    catch (const XMLException& toCatch) { 
     char* message = XMLString::transcode(toCatch.getMessage()); 
     cout << "Exception message is: \n" 
     << message << "\n"; 
     XMLString::release(&message); 
     return -1; 
    } 
    catch (const SAXParseException& toCatch) { 
     char* message = XMLString::transcode(toCatch.getMessage()); 
     cout << "Exception message is: \n" 
      << message << "\n"; 
     XMLString::release(&message); 
     return -1; 
    } 
    catch (...) { 
     cout << "Unexpected Exception \n" ; 
     return -1; 
    }  


//getch(); 
delete parser; 
delete defaultHandler; 
return 0; 
} 

,但最終得到了很多像這樣的錯誤:

錯誤LNK2019:無法解析的外部符號「__declspec(dllimport的) public:static void __cdecl xercesc_3_1 :: XMLString :: release(char * *,class xercesc_3_1 :: MemoryManager * const)「(_ imp?release @ XMLString @ xercesc_3_1 @@ SAXPAPADQAVMemoryManager @ 2 @@ Z) public:virtual void __thiscall ErnstSax2Handler :: startElement(wchar_t const * const,wchar_t const *常量,常量,wchar_t const * const,類xercesc_3_1 ::屬性const &)「(?startElement @ ErnstSax2Handler @@ UAEXQB_W00ABVAttributes @ xercesc_3_1 @@@ Z)XmlRead.obj 錯誤LNK2019:無法解析的外部符號」__declspec(dllimport)public:static void __cdecl xercesc_3_1 :: XMLString :: release(char * *,class xercesc_3_1 :: MemoryManager * const)「函數」public:virtual void「中引用的__cdecl xercesc_3_1 :: XMLString :: release(char * *,class xercesc_3_1 :: MemoryManager * const) __thiscall ErnstSax2Handler :: startElement(wchar_t const * const,wchar_t const * const,wchar_t const * const,class xercesc_3_1 :: Attributes const &)「(?startElement @ ErnstSax2Handler @@ UAEXQB_W00ABVAttributes @ xercesc_3_1 @@@ Z)XmlRead.obj 。

任何人都可以建議我一個不同的程序或上述程序的修復?

+1

可能重複(http://stackoverflow.com/questions/12573816/what-is- [什麼是未定義參考/解析的外部符號錯誤,以及如何解決呢?]一個-未定義參考懸而未決外部的非符號錯誤 - 和 - 如何-DO-I-固定) –

回答

0

我在使用Xerces Sax Parser時遇到了同樣的錯誤。 我能夠通過正確指定其他依賴關係來解決問題。 你需要指定的Xerces(包括庫和頭)在project.This額外的依賴將有望解決這一問題。在你的代碼

此外,您所創建的默認處理程序,即

DefaultHandler* defaultHandler = new DefaultHandler(); 
    xercesc::ContentHandler* h = new DefaultHandler(); 

相反,你必須創建你的處理器的情況下,即

DefaultHandler* defaultHandler = new ErnstSax2Handler(); 
    xercesc::ContentHandler* h = new ErnstSax2Handler(); 

當解析器遇到開始標記或內容標籤或結束標籤(或任何其他),你的處理程序的實例將被創建和功能在你的手柄r將被執行。

有用的鏈接:的http://www.onlamp.com/pub/a/onlamp/2005/11/10/xerces_sax.html