您可以使用 oracle 数据适配器从数据库中 select 一个 XML

Can you use the oracle dataadapter to select an XML from a database

使用 xmlagg 查询 (select xmlagg( xmlelement (... ) to select XML从数据库中可以更好地控制我们获取的数据的格式。

生成基于查询的模式为我们提供了带有单个记录(包含 xml)的标准 polingstatments。为 xml 创建模式也很容易(遵循 example 上的建议)

但是,将此架构添加到元素的数据结构类型不起作用。我可以 select 下拉列表中的架构,但当 selected 但任何其他条目都有效时,它会重置回前一个 selected 条目。 (在下图中,order_header 是我想使用的那个。)

我尝试忽略模式并查看是否可以映射结果,但 pollingstatement 中的数据实际上被转义了

<POLLINGSTMTRECORD><XML>&lt;order_header&gt;&lt;order_id&gt;206817&lt;/order_id&gt;

有没有人将 oracle 数据适配器与 xml 查询结合使用?有什么线索我哪里出错了吗?存储过程会是更好的解决方案吗?我能找到一种方法,数据不会将 < 更改为 &lt;

这里有几个选项:

类型化投票

如果您使用 TypedPolling,则必须通过以下两种方式之一提取消息(它将作为 CDATA 嵌入 xs:string 元素中):

XmlPolling

如果你使用 XmlPolling,你可以做一个巧妙的小技巧:

  1. 创建一个 'dummy' 信封模式(带有 xs:any 子项的单个记录,信封 = true,BodyXPath = <Any> 节点)
  2. 将 xmlStoredProcedureRootNodeName 设置为信封架构的根节点
  3. 将 xmlStoredProcedureRootNodeNamespace 设置为信封架构的命名空间
  4. 根据您的 Oracle 查询生成的 XML 创建一个模式

现在 XML 接收管道将 "debatch" 您对生成的架构的查询。这种分批是必要的,因为从理论上讲,一个查询可以在一个结果中产生多个文档(这将有多个根节点,这将是无效的)。或者,您可以将查询设计为生成根节点以外的所有内容,然后仅使用适配器设置来分配根节点,但我自己不太喜欢这种方法(我更喜欢能够快速轻松地测试结果未经修改的查询)。

解决方案相当简单,但很难找到相关文档。

我通过使用适配器服务并将 XML 查询放入绑定来创建接收端口。这创建了一个架构,直到包含 XML 的节点(在我的例子中,这被称为 XML)。

如果你只是 运行 这个,它会创建一个 XML 你创建 XML was a String in the XML element (all <> where escaped作为 <>).

要从轮询语句中获取元素,您首先需要创建一个结果的架构(这可以通过从格式良好的 XML 生成架构来轻松完成)

然后更改接收端口 "Inbound BizTalk Message body",使源为 "Path",并从 Visual Studio 为 XML 元素复制实例 xpath(持有 XML数据)

将 xpath 从元素属性复制到接收端口设置。您可以编写 Xpath,但我不推荐这样做。 (命名空间有点奇怪)

此时传入的消息是一个 XML,它遵循您的结果 XML 架构,可以用作 BizTalk 中的任何 XML(实际上更容易一点)使用 Oracle 适配器时获得的标准适配器,因为您摆脱了 pollingstmt/pollingrecord/pollingrecord 结构)

我想提一下,您的根节点需要是唯一的,并且 xpath 获得的 xml 需要为它找到一个架构。