3

我正在使用 xsd 3.3.0 编译器,以便将 xsd(xml 最好的朋友)文件解析为 C++ 类。(见最后一个网络链接)

命令名称是

xsd cxx-tree(选项)file.xsd

(+ 信息http://www.codesynthesis.com/projects/xsd/documentation/cxx/tree/guide/

我看过代码合成提供的一些示例,它们解析 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 ());

它接收一个带有文件名的字符串

字符串& uri = "hello.xsd"

并创建您在 main.cxx 中使用的对象。

所以,我试图对我的 xsd 文件做同样的事情。我使用 xsd cxx-tree 编译器,但它没有创建“解析 URI 或本地文件”的方法。然后我无法从我的主程序上的 xml 文件创建对象。

我使用 codesys 编译器文档 ( http://www.codesynthesis.com/projects/xsd/documentation/xsd.xhtml )中的不同选项解决了一些编译问题。关于你想编译什么,你想怎么做等等有不同的选项......但我找不到任何选项来启用用于“解析 URI 或本地文件”的方法。

提供更多信息,xml-xsd 文档是 CBML 协议文档。

谢谢您的帮助!

4

2 回答 2

1

我自己找到了解决方案!

我使用不同的选项进行编译。我使用了“--root-element library”选项,它导致方法“解析 URI 或本地文件”。没有创建。

我删除了这个选项并添加了“--root-element-all”,它为所有主体对象创建解析方法!

现在我的程序可以工作了!谢谢!

于 2014-03-06T08:55:47.067 回答
0

我一直使用这个产品。

这是您尝试做的一个示例(我认为):

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文件。

如果这不是您想要的,请在评论中告诉我,我可以尝试为您提供更多帮助。

于 2014-02-26T13:41:54.940 回答