2011-01-14 15 views
16

wiem jak stworzyć kompletną DOM z pliku XML tylko przy użyciu XercesDOMParser:Making Xerces analizowania ciąg zamiast pliku

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 

dobrze, to działa ... ale co jeśli bym chciał parsować ciąg? Coś jak

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 

używam wersji 3. Patrząc wewnątrz AbstractDOMParser widzę, że metoda parse i jej przeciążone wersje, tylko analizować pliki.

Jak mogę przeanalizować ciąg znaków?

Odpowiedz

18

Tworzenie MemBufInputSource i parse że:

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

Niestety nie rozumiem ostatniego parametru ... co to jest ?? ?? – Andry

+4

Jest to "fałszywy identyfikator systemu", który jest używany w komunikatach o błędach, a "wszelkie podmioty, do których odwołuje się ten podmiot za pośrednictwem względnych ścieżek/adresów URL, będą relatywne do tego fałszywego identyfikatora systemu". Zobacz Dokumenty API. –

+1

larsman czy mógłbyś mi powiedzieć dlaczego, kiedy używasz swojego kodu i poprawnie drukujesz xml, kiedy zadzwonię do Terminate() moja aplikacja przechodzi do Usterki Segmentacji ????? – Andry

11

Poniższa przeciążenie XercesDOMParser :: parse():

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

przekazując mu MemBufInputSource:

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

Jak mogę się dowiedzieć, w jakiej przestrzeni nazw znajdują się pliki MemBufInputSource i Wrapper4InputSource? Mam poważne problemy z przestrzeniami nazw w Xerces. Ty – Silver

+2

Jest on w przestrzeni nazw 'xercesc', ale potrzebujesz także' #include '. Spóźniłem się dwa lata, ale miałem ten sam problem, a ktoś inny może go mieć później. – VillasV

+0

Także +1 dla określenia wymaganego rzutu. – VillasV

1

Im robi to w inny sposób. Jeśli jest to niepoprawne, proszę powiedz mi dlaczego. Wydaje się działać. To co parse oczekuje:

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

Więc trzeba umieścić w DOMLSInput zamiast na 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

Dzięki za podpowiedź. Ta odpowiedź wydaje się być bliższa rzeczywistemu [DOM Programming Guide] (https://xerces.apache.org/xerces-c/program-dom-3.html) – user23573

Powiązane problemy