我尝试使用xerces-c来解析xml字符串。我已经使用xsd代码合成从xsd生成与字符串对应的cxx和hxx文件。我一直试图让它忽略xsd所归属的命名空间。在我收到的字符串中,所有元素都在它们前面有命名空间:filtermessage:filterMessage。我也试过发送没有命名空间的xml字符串。即只是filterMessage。无论哪种方式,我都会收到此错误:DOM异常解析,异常:期望元素' filtermessage#msgSystem'。我也尝试过:
auto_ptr<filterMessage> table(filterMessage_(*xmlDoc));
这给我带来了同样的错误。
DOMNodeList * getchildren命令没有问题。有谁知道如何让xerces-c忽略命名空间? (我成功地使用xerces -c来解析此消息,但它涉及我从xsd中取出命名空间以进行伪造)
XercesDOMParser* parser = new XercesDOMParser();
parser->setDoNamespaces(false);
parser->setDoSchema(false);
parser->setValidationScheme(XercesDOMParser::Val_Never);
parser->parse(xmlBuf);
DOMDocument *xmlDoc;
xmlDoc = parser->getDocument();
if(!xmlDoc)
{
cout << "Failed to parse" << endl;
return;
}
DOMElement* elementRoot = xmlDoc->getDocumentElement();
if( !elementRoot )
{
cout << "empty xml doc" << endl;
fflush(stdout);
}
else
{
DOMNodeList* children = elementRoot->getChildNodes();
cout << __FILE__ << " " << __LINE__ << endl;
fflush(stdout);
filterMessage msg(*elementRoot, xml_schema::flags::dont_validate);
cout << __FILE__ << " " << __LINE__ << endl;
fflush(stdout);
}
输出:
Filter.cpp 119
DOM Exception parsing, exception: expected element 'filtermessage#msgSystem'
这是字符串的开头:
< filtermessage:filterMessage xmlns:filtermapping="filtermapping" xmlns:filtermessage="filtermessage">
< filtermessage:msgSystem>