Ответ 1
Создайте MemBufInputSource
и parse
что:
xercesc::MemBufInputSource myxml_buf(myxml.c_str(), myxml.size(),
"myxml (in memory)");
parser->parse(myxml_buf);
Я знаю, как создать полный dom из xml файла, используя 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
Ну, это работает... но что, если я захочу разобрать строку? Что-то вроде
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
Я использую версию 3. Глядя внутрь AbstractDOMParser
, я вижу, что метод parse и его перегруженные версии, только анализировать файлы.
Как я могу анализировать строку?
Создайте MemBufInputSource
и parse
что:
xercesc::MemBufInputSource myxml_buf(myxml.c_str(), myxml.size(),
"myxml (in memory)");
parser->parse(myxml_buf);
Используйте следующую перегрузку XercesDOMParser:: parse():
void XercesDOMParser::parse(const InputSource& source);
передает его MemBufInputSource:
MemBufInputSource src((const XMLByte*)myxml.c_str(), myxml.length(), "dummy", false);
parser->parse(src);
Я делаю это по-другому. Если это неверно, сообщите мне, почему. Кажется, это работает. Это то, что ожидает синтаксический анализ:
DOMDocument* DOMLSParser::parse(const DOMLSInput * source )
Поэтому вам нужно добавить DOMLSInput вместо 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);