2011-01-14 12 views
16

so come creare un dom completa da un file XML usando solo XercesDOMParser:Fare Xerces analizzare una stringa invece di un file

xercesc::XercesDOMParser parser = new xercesc::XercesDOMParser(); 
parser->parse(path_to_my_file); 
parser->getDocument(); // From here on I can access all nodes and do whatever i want 

Beh, che funziona ... ma cosa succede se avrei voluto analizzare una stringa? Qualcosa di simile

std::string myxml = "<root>...</root>"; 
xercesc::XercesDOMParser parser = new xercesc::XercesDOMParser(); 
parser->parse(myxml); 
parser->getDocument(); // From here on I can access all nodes and do whatever i want 

sto usando la versione 3. Guardando dentro il AbstractDOMParser vedo che il metodo di analisi e le sue versioni di overload, analizzare solo i file.

Come analizzare da una stringa?

risposta

18

Creare un MemBufInputSource e parse che:

xercesc::MemBufInputSource myxml_buf(myxml.c_str(), myxml.size(), 
            "myxml (in memory)"); 
parser->parse(myxml_buf); 
+1

Mi dispiace non capisco l'ultimo parametro ... di cosa si tratta ?? ?? – Andry

+4

È un "falso id di sistema" che viene utilizzato nei messaggi di errore e "qualsiasi entità cui si fa riferimento da questa entità tramite percorsi/URL relativi sarà relativa a questo falso ID di sistema". Vedi documenti API. –

+1

larsmans potresti dirmi perché, quando uso il tuo codice e stampo correttamente xml, quando chiamo Terminate() la mia app va in errore di segmentazione ????? – Andry

11

Usare il seguente overload di XercesDOMParser :: parse():

void XercesDOMParser::parse(const InputSource& source); 

passandogli un MemBufInputSource:

MemBufInputSource src((const XMLByte*)myxml.c_str(), myxml.length(), "dummy", false); 
parser->parse(src); 
+1

Come posso capire in quale spazio dei nomi sono MemBufInputSource e Wrapper4InputSource? Sto avendo seri problemi con gli spazi dei nomi in xerces. Ty – Silver

+2

È nello spazio dei nomi 'xercesc', ma è necessario anche' #include '. Ho due anni di ritardo, ma ho avuto lo stesso problema e qualcun altro può averlo di nuovo in seguito. – VillasV

+0

Anche +1 per specificare anche il cast necessario. – VillasV

1

Im farlo in un altro modo. Se questo non è corretto, per favore dimmi perché. Sembra funzionare. Questo è ciò che si aspetta parse:

DOMDocument* DOMLSParser::parse(const DOMLSInput * source) 

Quindi è necessario mettere in un DOMLSInput invece di un un InputSource:

xercesc::DOMImplementation * impl = xercesc::DOMImplementation::getImplementation(); 
xercesc::DOMLSParser *parser = (xercesc::DOMImplementationLS*)impl)->createLSParser(xercesc::DOMImplementation::MODE_SYNCHRONOUS, 0); 
xercesc::DOMDocument *doc; 

xercesc::Wrapper4InputSource source (new xercesc::MemBufInputSource((const XMLByte *) (myxml.c_str()), myxml.size(), "A name"); 
parser->parse(&source); 
+0

Grazie per questo suggerimento. Questa risposta sembra essere più vicina all'effettiva [Guida alla Programmazione DOM] (https://xerces.apache.org/xerces-c/program-dom-3.html) – user23573

Problemi correlati