Заставить Xerces разбирать строку вместо файла - PullRequest
16 голосов
/ 14 января 2011

Я знаю, как создать полный 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, я вижу, что метод синтаксического анализа и его перегруженные версии, только файлы синтаксического анализа.

Как я могу проанализироватьстрока

Ответы [ 3 ]

20 голосов
/ 14 января 2011

Создайте MemBufInputSource и parse, что:

xercesc::MemBufInputSource myxml_buf(myxml.c_str(), myxml.size(),
                                     "myxml (in memory)");
parser->parse(myxml_buf);
12 голосов
/ 14 января 2011

Используйте следующую перегрузку XercesDOMParser :: parse ():

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

, передавая ему MemBufInputSource:

MemBufInputSource src((const XMLByte*)myxml.c_str(), myxml.length(), "dummy", false);
parser->parse(src);
1 голос
/ 05 апреля 2013

Я делаю это по-другому.Если это неправильно, пожалуйста, скажите мне, почему.Вроде работает.Вот что ожидает синтаксический анализ:

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);
...