19

我知道如何仅使用 XercesDOMParser 从 xml 文件创建完整的 dom:

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 方法及其重载版本,只解析文件。

如何从字符串中解析?

4

3 回答 3

21

创建一个MemBufInputSourceparse那个:

xercesc::MemBufInputSource myxml_buf(myxml.c_str(), myxml.size(),
                                     "myxml (in memory)");
parser->parse(myxml_buf);
于 2011-01-14T12:38:01.027 回答
13

使用 XercesDOMParser::parse() 的以下重载:

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

传递一个 MemBufInputSource:

MemBufInputSource src((const XMLByte*)myxml.c_str(), myxml.length(), "dummy", false);
parser->parse(src);
于 2011-01-14T12:40:06.717 回答
3

我用另一种方式做。如果这是不正确的,请告诉我原因。它似乎工作。这是 parse 所期望的:

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);
于 2013-04-05T08:39:57.173 回答