2011-01-14 15 views
16

sé cómo crear un DOM completa desde un archivo XML usando sólo XercesDOMParser:Xerces analizar una cadena en lugar de un archivo

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, que funciona ... pero lo que si que me gustaría analizar una cadena? Algo así 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 del AbstractDOMParser veo que el método de análisis sintáctico y sus versiones sobrecargadas, sólo se analizan los archivos.

¿Cómo puedo analizar desde una cadena?

Respuesta

18

Crear una MemBufInputSource y parse que:

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

Lo siento, no entienden el último parámetro ... ¿qué es ?? ?? – Andry

+4

Es una "identificación de sistema falsa" que se usa en los mensajes de error y "cualquier entidad a la que se haga referencia desde esta entidad a través de rutas/URL relativas será relativa a esta identificación falsa del sistema". Ver los documentos de la API. –

+1

larsmans ¿podría decirme por qué, cuando uso su código e imprimo correctamente el xml, cuando llamo a Terminate() mi aplicación sigue Error de segmentación ????? – Andry

11

Usar la siguiente sobrecarga del 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); 
+1

¿Cómo puedo saber en qué espacio de nombres están MemBufInputSource y Wrapper4InputSource? Estoy teniendo serios problemas con los espacios de nombres en xerces. Ty – Silver

+2

Está en el espacio de nombres 'xercesc', pero también necesita' #include '. Tengo dos años de retraso, pero tuve el mismo problema y alguien más puede tenerlo nuevamente más tarde. – VillasV

+0

También +1 para especificar también el lanzamiento necesario. – VillasV

1

Im haciéndolo de otra manera. Si esto es incorrecto, por favor dime por qué. Parece funcionar. Esto es lo que espera de análisis:

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

Así que hay que poner en un DOMLSInput en vez de una una 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

Gracias por insinuar esto. Esta respuesta parece estar más cerca de la actual [Guía de programación DOM] (https://xerces.apache.org/xerces-c/program-dom-3.html) – user23573

Cuestiones relacionadas