Classe XSD para C++ usando o analisador xsd cxx-tree.Métodos para abrir um xml a partir de um arquivo.

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

Pergunta

Estou usando o compilador xsd 3.3.0 para analisar um arquivo xsd (melhor amigo xml) para a classe C++.(ver último link)

O nome do comando é

xsd cxx-tree (opções) arquivo.xsd

(+ informações http://www.codesynthesis.com/projects/xsd/documentation/cxx/tree/guide/)

Já vi alguns exemplos fornecidos pela Codesynthesis onde eles analisam um documento hello.xsd e criam um arquivo .hxx e .cxx com muita facilidade.O .hxx possui um método para abrir um documento xml criando um objeto onde você pode encontrar as diferentes partes do xml, verificá-lo, etc...O .hxx tem um código como este:

// 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 ());

Ele recebe uma string com o nome do arquivo

string& uri = "olá.xsd"

e crie o objeto que você usa no main.cxx.

Então, estou tentando fazer o mesmo com meu arquivo xsd.Eu uso o compilador xsd cxx-tree, mas ele não cria os métodos para "Analisar um URI ou um arquivo local".Então não consigo criar um objeto a partir de um arquivo xml no meu programa principal.

Eu resolvo alguns problemas de compilação usando diferentes opções da documentação do compilador Codesys (http://www.codesynthesis.com/projects/xsd/documentation/xsd.xhtml).Existem diferentes opções sobre o que você deseja compilar, como deseja fazê-lo, etc ...mas não consigo encontrar nenhuma opção para ativar os métodos usados ​​para "Analisar um URI ou um arquivo local".

Dando mais informações, os documentos xml-xsd são documentos do protocolo CBML.

Obrigado pela ajuda!

Foi útil?

Solução 2

Eu encontrei a solução sozinho!

Usei diferentes opções para compilar.Eu usei a opção "-Biblioteca de elementos de root" e isso fez com que os métodos "analisassem um URI ou um arquivo local". não foi criado.

Excluí esta opção e adicionei "--root-element-all" que cria métodos de análise para todos os objetos principais!

Agora meu programa funciona!obrigado!

Outras dicas

Eu uso esse produto o tempo todo.

Aqui está um exemplo do que você está tentando fazer (eu acho):

xsd cxx-tree hello.xsd

O que gera o hello.hxx e a hello.cxx, como você disse.Acho que você está falhando em entender como usar esses arquivos para carregar um arquivo XML (por exemplo, carregar um "arquivo local").

Gosto de dizer explicitamente ao software onde encontrar o esquema XSD.O código a seguir não será compilado, mas o incluí para referência.

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
    }

}

Certifique-se de vincular o *.cxx arquivo para o seu *.cpp arquivos.

Se não é isso que você queria, me avise nos comentários e posso tentar te ajudar mais um pouco.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top