Я пытаюсь встроить небольшую программу c ++ xerces в мое приложение go, чтобы проверить xml на xsd.
Программа компилируется и работает нормально, когда я использую g ++ с помощью следующей команды:
g++ test-xerces.cpp -o xercesTest -v -lxerces-c
./xercesTest
Однако при использовании go build
Я получаю следующий вывод:
go build validation-xerces.go
# command-line-arguments
In file included from
/usr/local/include/xercesc/util/RefHashTableOf.hpp:252:0,
from
/usr/local/include/xercesc/internal/XSerializeEngine.hpp:25,
from
/usr/local/include/xercesc/internal/XSerializable.hpp:25,
from /usr/local/include/xercesc/util/QName.hpp:30,
from /usr/local/include/xercesc/framework/XMLAttr.hpp:26,
from
/usr/local/include/xercesc/framework/XMLDocumentHandler.hpp:27,
from
/usr/local/include/xercesc/parsers/AbstractDOMParser.hpp:26,
from
/usr/local/include/xercesc/parsers/XercesDOMParser.hpp:26,
from ./validation-xerces.go:10:
/usr/local/include/xercesc/util/RefHashTableOf.c:33:15: fatal error: new: No such file or directory
#include <new>
^
compilation terminated.
Рассматриваемая программа (я украл почти каждую ее часть у людей, которые умнее меня):
package main
/*
#cgo LDFLAGS: lxerces-c
#include <stdio.h>
#include <xercesc/util/XMLString.hpp>
#include <xercesc/parsers/XercesDOMParser.hpp>
#include <xercesc/framework/LocalFileInputSource.hpp>
#include <xercesc/sax/ErrorHandler.hpp>
#include <xercesc/sax/SAXParseException.hpp>
#include <xercesc/sax/EntityResolver.hpp>
XERCES_CPP_NAMESPACE_USE
class ParserErrorHandler : public ErrorHandler
{
private:
void reportParseException(const SAXParseException& ex)
{
char* msg = XMLString::transcode(ex.getMessage());
fprintf(stderr, "at line %llu column %llu, %s\n",
ex.getColumnNumber(), ex.getLineNumber(), msg);
XMLString::release(&msg);
}
public:
void warning(const SAXParseException& ex)
{
reportParseException(ex);
}
void error(const SAXParseException& ex)
{
reportParseException(ex);
}
void fatalError(const SAXParseException& ex)
{
reportParseException(ex);
}
void resetErrors()
{
}
};
void ValidateSchema(const char* xmlFilePath)
{
XercesDOMParser domParser;
ParserErrorHandler parserErrorHandler;
domParser.setErrorHandler(&parserErrorHandler);
domParser.setValidationScheme(XercesDOMParser::Val_Auto);
domParser.setDoNamespaces(true);
domParser.setDoSchema(true);
domParser.setValidationConstraintFatal(true);
domParser.parse(xmlFilePath);
if (domParser.getErrorCount() == 0)
printf("XML file validated against the schema successfully\n");
else
printf("XML file doesn't conform to the schema\n");
}
int Cmain(int argc, const char *argv[])
{
if (argc != 2)
{
printf("SchemaValidator <xml file>\n");
return 0;
}
XMLPlatformUtils::Initialize();
ValidateSchema(argv[1]);
XMLPlatformUtils::Terminate();
return 0;
}
*/
import "C"import (
"unsafe")
func main() {
argv := [][]byte{
[]byte(`/path/to/my/file.xml`),
}
c_argc := C.int(len(argv))
var b *C.char
ptrSize := unsafe.Sizeof(b)
c_argv := C.malloc(C.size_t(len(argv)) * C.size_t(ptrSize))
defer C.free(unsafe.Pointer(c_argv))
// Assign each byte slice to its appropriate offset.
for i := 0; i < len(argv); i++ {
element := (**C.char)(unsafe.Pointer(uintptr(c_argv) + uintptr(i)*ptrSize))
*element = (*C.char)(unsafe.Pointer(&argv[i][0]))
}
C.Cmain(c_argc, (**C.char)(c_argv))
}
Задача ещё не решена.
Других решений пока нет …