无法将架构添加到架构集合

Can't add a schema to a schema collection

提问人:aprotiere 提问时间:6/24/2023 最后编辑:aprotiere 更新时间:6/27/2023 访问量:35

问:

介绍:

我不是C++专家,也不是MSXML专家,这就是为什么我试图从尽可能简单的事情开始,例如获取一些文档示例代码并尝试修改一些参数。

事情是这样的,我正在使用此示例来验证一些 XML 文件是否符合 XSD 模式。 代码在我的计算机上运行良好,只要我保持代码完全相同,它就会执行它应该做的事情。

因此,我想稍微修改一下这段代码,以便我可以根据自己的 XSD 架构验证我自己的 XML 文件。

什么是有效的:

因此,此代码可以完美地处理这些文件。这至少证明我对我的环境或我的库没有问题。

我改变了什么:

一旦我修改代码以使其验证我自己的文件,它就不再起作用了。 以下是我更改的几行:

这:CHK_HR(VariantFromString(L"books.xml", varXMLFileName));

变成了这样:CHK_HR(VariantFromString(L"facturx.xml", varXMLFileName));

这:CHK_HR(VariantFromString(L"books.xsd", varXSDFileName));

变成了这样:CHK_HR(VariantFromString(L"cii.xsd", varXSDFileName));

这:bstr = SysAllocString(L"urn:books");

变成了这样:bstr = SysAllocString(L"urn:un:unece:uncefact:data:crossindustry:3:draft");

没什么了不起的,我只是在更改文件输入。 另外,我的文件应该很干净:

  • cii.xsd是 - 我认为 - 官方 CII XSD 模式,我在那里找到了它。
  • facturx.xml是一个应该符合 CII 标准的示例文件,我在那里找到了它

什么不起作用:

因此,从现在开始,通过这些修改后的行,代码将停止在这一行:

CHK_HR(pSCache->add(bstr, varXSDObject));

当程序运行此行时,它将停止。当然,当我使用示例文件时,这种情况从未发生过。

我尝试过的:

我试图查看我的输入文件,看看它们是否有明显的错误,导致代码崩溃,但我找不到任何问题。我还尝试过其他一些文件,但仍然不起作用。

我试图在这一行周围放置一个 try/catch(...) 块以查看错误是什么,但它甚至没有触发 catch 块,程序只是崩溃而没有错误或没有堆栈跟踪。

我试图查看 stackoverflow 中的文档或其他帖子,但我找不到任何相关内容。

编辑:我设法通过从这里更改宏来打印错误消息:

// Macro that calls a COM method returning HRESULT value.
#define CHK_HR(stmt) do { hr=(stmt); if (FAILED(hr)) goto CleanUp; } while(0)

对此:

// Macro that calls a COM method returning HRESULT value.
#define CHK_HR(stmt) do { hr=(stmt); if (FAILED(hr)) {std::string message = std::system_category().message(hr);std::cout << message; goto CleanUp;} } while(0)

错误消息是:Unspecified error

我怎么知道问题出在哪里......

我在问什么:

所以,我有几个问题,如果我能有一个答案,那会很有帮助:

我可以尝试什么来确定问题的来源?正如我所说,我不是C++专家,所以我真的不知道最好的调试方法。变量内容难以理解,我无法让它引发异常或堆栈跟踪。

问题出在我的代码还是我的文件上?

问题是什么?

我有点绝望,因为仅仅获取示例代码并对其进行修改应该不难,但看起来比预期的要难。

C++ XML XSD MSXML MSXML6

评论

0赞 Martin Honnen 6/24/2023
该架构是否确实具有或包含其他架构模块?我认为要使用 MSXML 6 加载任何外部资源,您需要将权限显式设置为 true。我无法说明如何使用 C++ 做到这一点,我不确定您需要在哪里设置它,我会先尝试使用 .如果这不起作用,请尝试将架构本身加载到它自己的 DOM 文档中,在加载之前已将 resolveExternals 属性设置为 true,然后将架构 DOM 文档添加到集合中。xs:importxs:includeresolveExternals(*ppDoc)->put_resolveExternals(VARIANT_TRUE);
0赞 aprotiere 6/27/2023
确实有一些,但在删除它并再次测试代码后,它什么也没改变。我会记住的,它可能会给我带来一些麻烦。谢谢你的回答。xs:include

答: 暂无答案