Преобразование XSD в класс C ++ с использованием xsd cxx-древовидного анализатора.Методы открытия xml-файла из файла.
-
21-12-2019 - |
Вопрос
Я использую компилятор xsd 3.3.0, чтобы разобрать файл xsd (лучший друг xml) в класс C ++.(смотрите последнюю веб-ссылку)
Имя команды - это
файл xsd cxx-tree (параметры).xsd
(+ информация http://www.codesynthesis.com/projects/xsd/documentation/cxx/tree/guide/)
Я видел несколько примеров, предоставленных codesynthesis, где они анализируют документ hello.xsd и очень легко создают файлы .hxx и .cxx.В .hxx есть метод для открытия xml-документа, создающего объект, в котором вы можете найти различные части xml, проверить его и т.д...В файле .hxx есть такой код, как этот:
// Parse a URI or a local file.
//
::std::auto_ptr< ::hello_t >
hello (const ::std::string& uri,
::xml_schema::flags f = 0,
const ::xml_schema::properties& p = ::xml_schema::properties ());
Он получит строку с именем файла
string& uri = "привет.xsd"
и создайте объект, который вы используете в main.cxx.
Итак, я пытаюсь сделать то же самое с моим xsd-файлом.Я использую компилятор xsd cxx-tree, но он не создает методы для "Анализа URI или локального файла"..Тогда я не могу создать объект из xml-файла в моей основной программе.
Я решаю некоторые проблемы с компиляцией, используя различные опции из документации компилятора codesys (http://www.codesynthesis.com/projects/xsd/documentation/xsd.xhtml).Существуют различные варианты того, что вы хотите скомпилировать, как вы хотите это сделать и т.д...но я не могу найти никаких опций, позволяющих включить методы, используемые для "Анализа URI или локального файла"..
Предоставляя дополнительную информацию, документы xml-xsd являются документами протокола CBML.
Спасибо вам за вашу помощь!
Решение 2
Я нашел решение самостоятельно!
Я использовал разные варианты компиляции.Я использовал опцию «--ROOT-Element Library», и это вызвало, что методы «анализировать URI или локальный файл».не был создан.
Я удаляю эту опцию, и я добавил «--root-Element - все», которые создают методы анализа для всех объектов принципалов!
Теперь моя программа работает!Спасибо!
Другие советы
Я постоянно пользуюсь этим продуктом.
Вот пример того, что вы пытаетесь сделать (я думаю):
xsd cxx-tree hello.xsd
Который генерирует hello.hxx
и тот hello.cxx
, как вы уже сказали.Я думаю, что вам не хватает понимания того, как использовать эти файлы для загрузки XML-файла (например, загрузки "локального файла").
Мне нравится явно указывать программному обеспечению, где найти XSD-схему.Следующий код не будет компилироваться, но я включил его для справки.
void load(const std::string &xml, const std::string &xsd) {
xml_schema::properties properties;
properties.no_namespace_schema_location(xsd);
// or, if you have a specific namespace you want to load, use
// props.schema_location("which namespace", xsd);
try {
std::auto_ptr< ::hello_t> xml_file = hello(xml, 0, props);
// operate on the xml_file via "->" notation
std::cout << xml_file->hello() << std::endl;
} catch (const ::xml_schema::exception &e) {
std::ostringstream os;
os << e.what();
// report the error as you see fit, use os.str() to get the string
}
}
Обязательно свяжите *.cxx
файл на ваш *.cpp
Файлы.
Если это не то, что вы хотели, дайте мне знать в комментариях, и я постараюсь помочь вам еще немного.