我正在使用libxml2根據xsd模式驗證xml文件。 使用xmlSchemaSetParserErrors函數,將錯誤輸出到stderr。 我需要得到這些驗證錯誤,將它們存儲在內存中並顯示給用戶。 我該如何重定向這些錯誤?你能提供一些例子嗎? 謝謝, Andrealibxml2獲取驗證錯誤
2
A
回答
2
本示例使用解析器模塊的驗證回調機制。預計回調的簽名似乎是相同的。
#include <iostream>
#include <cstdarg>
#include <cstdio>
#include <vector>
#include <string>
#include <iterator>
#include <libxml/parser.h>
#include <libxml/tree.h>
struct ParserContext
{
ParserContext() : context(xmlNewParserCtxt()) {}
~ParserContext() { xmlFreeParserCtxt(context); }
xmlParserCtxtPtr context;
private:
ParserContext(ParserContext&);
void operator=(ParserContext&);
};
struct ErrorHandler
{
std::vector<std::string> errors;
void RegisterErrorHandling(xmlValidCtxt& validationContext)
{
// Change this to register for schema errors...
validationContext.userData = this;
validationContext.error = &ErrorHandler::Handle;
}
private:
static void Handle(void *handler, const char *format, ...)
{
va_list arguments;
va_start(arguments, format);
std::string message = MakeMessage(format, arguments);
va_end(arguments);
ErrorHandler* errorHandler = static_cast<ErrorHandler*>(handler);
errorHandler->errors.push_back(message);
}
static std::string MakeMessage(const char* format, va_list arguments)
{
const size_t bufferSize = 200;
std::vector<char> buffer(bufferSize, 0);
size_t charactersWritten =
vsnprintf(&buffer.front(), bufferSize, format, arguments);
if (charactersWritten == -1)
buffer.back() = 0; // Message truncated!
return std::string(&buffer.front());
}
};
struct XmlDocument
{
static XmlDocument FromFile(const char* fileName)
{
ParserContext parser;
ErrorHandler errorHandler;
errorHandler.RegisterErrorHandling(parser.context->vctxt);
XmlDocument document(xmlCtxtReadFile(
parser.context, fileName, NULL, XML_PARSE_DTDVALID));
document.errors = move(errorHandler.errors);
return document;
}
XmlDocument(XmlDocument&& other) :
xmlPointer(other.xmlPointer),
errors(move(other.errors))
{
other.xmlPointer = nullptr;
}
~XmlDocument()
{
xmlFreeDoc(xmlPointer);
}
xmlDocPtr xmlPointer;
std::vector<std::string> errors;
private:
XmlDocument(xmlDocPtr pointer) : xmlPointer(pointer) {}
XmlDocument(XmlDocument&);
void operator=(XmlDocument&);
};
void DisplayErrorsToUser(
const XmlDocument& document,
std::ostream& displayStream = std::cout)
{
using namespace std;
copy(begin(document.errors), end(document.errors),
ostream_iterator<string>(displayStream, "\n"));
}
int main()
{
auto xml = XmlDocument::FromFile("test.xml");
DisplayErrorsToUser(xml);
}
1
正如API文檔中說,xmlSchemaSetParserErrors()Set the callback functions used to handle errors for a validation context.
你需要寫關於兩個回調函數來定義的特徵:
一個例子可以是:
void err(void *ctx, const char *msg, ...)
{
char buf[1024];
va_list args;
va_start(args, msg);
int len = vsnprintf_s(buf, sizeof(buf), sizeof(buf)/sizeof(buf[0]), msg, args);
va_end(args);
if(len==0) // Can't create schema validity error!
else // Do something to store `buf`,
// you may need to use void *ctx to achieve this
return;
}
然後就叫
xmlSchemaSetValidErrors(valid_ctxt_ptr, (xmlSchemaValidityErrorFunc) err, (xmlSchemaValidityWarningFunc) warn, ctx);
調用
xmlSchemaValidateDoc()
2
甚至更簡潔之前:
void err(void *ctx, const char *msg, ...)
{
va_list args;
va_start(args, msg);
char *val = va_arg(args,char*);
va_end(args);
}
val現在包含驗證錯誤
相關問題
- 1. 獲取驗證錯誤的用戶
- 2. 獲取軌JSON驗證錯誤
- 3. firebase 3身份驗證獲取錯誤
- 4. 獲取驗證碼圖片的錯誤
- 5. 驗證DTO並獲取錯誤消息
- 6. 獲取驗證錯誤與HapiJS
- 7. 獲取OAuth身份驗證錯誤
- 8. 如何獲取所有驗證錯誤?
- 9. Kohana 3 - 獲取orm驗證錯誤
- 10. 獲取錯誤:「驗證viewState MAC失敗。」
- 11. XML驗證。獲取錯誤號
- 12. 使用正則表達式的LibXML2日期驗證錯誤
- 13. CodeIgniter表單驗證,無法獲取驗證錯誤
- 14. facebook錯誤'驗證驗證碼錯誤'
- 15. 驗證錯誤與驗證錯誤
- 16. 從Twitter API獲取錯誤的身份驗證數據錯誤
- 17. 安裝錯誤:libxml2
- 18. libxml2錯誤處理
- 19. 獲取此錯誤:SSL3_GET_SERVER_CERTIFICATE證書驗證失敗
- 20. 驗證錯誤
- 21. 驗證錯誤
- 22. 驗證錯誤
- 23. 驗證錯誤
- 24. 驗證錯誤
- 25. 驗證錯誤
- 26. 用libxml2 sax解析器獲取值錯誤
- 27. Laravel驗證整數,但獲取驗證錯誤必須是整數
- 28. 如何捕獲RESTEasy Bean驗證錯誤?
- 29. jQuery驗證未捕獲引用錯誤
- 30. WPF DataGrid驗證錯誤未被捕獲
除非我遺漏了一些東西,* xmlSchemaSetParserErrors()*可用於設置您自己的回調錯誤。那麼,問題在哪裏,先生? –
沒有問題,我只是在尋找一個關於如何爲錯誤設置自定義回調的例子。 –