您可以使用oracle dataadapter从数据库中选择XML

时间:2015-04-13 08:30:14

标签: xml oracle biztalk

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

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

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

DataStructure type

我试图忽略架构,看看我是否只能映射结果,但是pollingstatement中的数据实际上已经转义

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

有没有人将oracle dataadapter与xml查询结合起来?我出错的任何线索?存储过程会更好地解决这个问题吗?我能找到一种方法,数据不会改变&lt;到&lt;

2 个答案:

答案 0 :(得分:1)

你有几个选择:

键入轮询

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

XmlPolling

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

  1. 创建一个&#39;虚拟&#39;信封模式(带有xs的单个记录:任何子项,envelope = true,BodyXPath = <Any>节点)
  2. 将xmlStoredProcedureRootNodeName设置为信封架构的根节点
  3. 将xmlStoredProcedureRootNodeNamespace设置为信封架构的命名空间
  4. 创建Oracle查询生成的XML的架构
  5. 现在,XML Recieve管道将&#34; debatch&#34;您对所生成的架构的查询。这种调度是必要的,因为理论上,查询可以在单个结果中产生多个文档(这将具有多个根节点,这将是无效的)。或者,您可以设计查询以生成除根节点之外的所有内容,然后只使用适配器设置来分配根节点,但我自己也不喜欢这种方法(我更喜欢能够快速轻松地无需修改即可测试查询结果。)

答案 1 :(得分:1)

解决方案相当简单,但有点难以找到文档。

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

auto generated item

如果您只是运行它,它将创建一个XML,您在其中创建XML是XML元素中的String(所有&lt;&gt;转义为&lt;&gt;)。

要从polling语句中获取元素,首先需要创建一个结果将如何显示的模式(这可以通过从格式良好的XML生成模式来轻松完成)

然后更改receiveport“Inbound BizTalk Message body”,使源为“Path”,并从Visual Studio复制实例xpath以获取XML元素(包含XML数据的元素上的属性)

here be instance XPaths

将xpath从元素属性复制到receiveport设置。你可以写Xpath但我不能推荐它。 (它在命名空间上有点特殊)

receive port settings

此时出现的消息是一个遵循结果XML模式的XML,可以用作BizTalk中的任何XML(实际上比使用Oracle适配器时获得的标准更简单,因为您摆脱了pollingstmt / pollingrecord / pollingrecord结构)

我想提一下你的根节点需要是唯一的,xpath得到的xml需要为它找到一个Schema。