Преобразование XSD в класс C ++ с использованием xsd cxx-древовидного анализатора.Методы открытия xml-файла из файла.

StackOverflow https://stackoverflow.com//questions/22039373

Вопрос

Я использую компилятор 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 Файлы.

Если это не то, что вы хотели, дайте мне знать в комментариях, и я постараюсь помочь вам еще немного.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top