c++ - Haciendo que Xerces analice una cadena en lugar de un archivo
xml parsing (3)
Cree un MemBufInputSource
y MemBufInputSource
que:
xercesc::MemBufInputSource myxml_buf(myxml.c_str(), myxml.size(),
"myxml (in memory)");
parser->parse(myxml_buf);
Sé cómo crear un dom completo a partir de un archivo xml usando XercesDOMParser:
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
Bueno, eso funciona ... pero ¿y si quisiera analizar una cadena? Algo como
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
Estoy usando la versión 3. Mirando dentro de AbstractDOMParser
veo que el método de análisis y sus versiones sobrecargadas, solo analizan archivos.
¿Cómo puedo analizar desde una cadena?
Lo estoy haciendo de otra manera. Si esto es incorrecto, por favor dime por qué. Parece funcionar. Esto es lo que el análisis espera:
DOMDocument* DOMLSParser::parse(const DOMLSInput * source )
Por lo tanto, debe colocar un DOMLSInput en lugar de 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);
Utilice la siguiente sobrecarga de XercesDOMParser :: parse ():
void XercesDOMParser::parse(const InputSource& source);
pasándole un MemBufInputSource:
MemBufInputSource src((const XMLByte*)myxml.c_str(), myxml.length(), "dummy", false);
parser->parse(src);