【发布时间】:2019-02-15 22:33:29
【问题描述】:
我正在编写一个库来获取 xml 文件并对其进行解析。为了防止用户将无效的 xml 输入我的应用程序,我使用 xerces 通过 xsd 验证 xml 文件。
但是,我只设法针对 xsd 文件进行验证。从理论上讲,用户可以打开这个文件并搞乱它。这就是为什么我希望我的 xsd 在我的库中被硬编码。
不幸的是,我还没有找到使用 XercesC++ 的方法。
这就是它现在的工作方式......
bool XmlParser::validateXml(std::string a_XsdFilename)
{
xercesc::XercesDOMParser domParser;
if (domParser.loadGrammar(a_XsdFilename.c_str(), xercesc::Grammar::SchemaGrammarType) == NULL)
{
throw Exceptions::Parser::XmlSchemaNotReadableException();
}
XercesParserErrorHandler parserErrorHandler;
domParser.setErrorHandler(&parserErrorHandler);
domParser.setValidationScheme(xercesc::XercesDOMParser::Val_Always);
domParser.setDoNamespaces(true);
domParser.setDoSchema(true);
domParser.setValidationSchemaFullChecking(true);
domParser.parse(m_Filename.c_str());
return (domParser.getErrorCount() == 0);
}
std::string m_Filename 是一个成员变量,保存着我验证的 xml 的路径。
std::string a_XsdFilename 是我验证的 xsd 的路径。
XercesParserErrorHandler 继承自 xercesc::ErrorHandler 并进行错误处理。
如何将std::string a_XsdFilename 替换为std::string a_XsdText 之类的东西?
其中std::string a_XsdText 包含架构定义本身,而不是包含架构定义的文件的路径。
【问题讨论】:
标签: c++ xml xsd xerces xerces-c