0

我正在尝试通过 Biztalk 2006 R2 将平面文件导入 SQL 数据库。输入文件的布局如下,每行由 CR/LF 分隔,末尾有一个额外的尾随 CR/LF:

00(29characters after)  <=== Header
07(997characters after) <=== Record Type 07 (unbounded, 0-?? possible records)
08(86characters after)  <=== Record Type 08 (unbounded, 0-?? possible records)
09(89characters after)  <=== Record Type 09 (unbounded, 0-?? possible records)
10(94characters after)  <=== Record Type 10 (unbounded, 0-?? possible records)
16(35characters after)  <=== Group Footer
17(30characters after)  <=== File Footer

无论如何,我运行了平面文件向导,它创建了一个 XML,但即使选择了“重复记录”,它也将最小和最大出现次数设置为 07、08、09 和 10。我将最小值更改为 0,将最大值更改为无界。现在,无论我做什么,我都会在查找时得​​到 Unexpected data found:'\r\n' 验证时的错误。我尝试将默认子顺序设置为后缀,并将根的子顺序设置为中缀和后缀。似乎没有任何帮助。

4

2 回答 2

2

从头开始创建架构

我认为即使对于像这个这样的中等复杂结构,使用平面文件模式向导也不值得麻烦。我的建议是考虑整体结构,并使用模式编辑器提供大纲。

因此,您的示例调用具有以下结构的模式:

单个Header记录类型00为 ,后跟一系列记录类型07分别为080910。每个类型化的记录本身就是一个结构,它包含任意数量的重复记录。最后,该结构以单个GroupTrailer记录 typed结束16,然后是一条整体Trailer记录 typed 17

这很好地映射到 BizTalk 中的以下架构:

平面文件架构结构

现在,您需要调整节点的各种属性,以指示平面文件反汇编程序如何解析传入的消息。

根记录

Root记录只是用于将各种子记录组合在一起,并且是结构正确的 XML 文档所必需的。但是,它不参与传入结构的解析。

因此,您应该将 设置Child Delimiter TypeNone

Header、GroupTrailer 和 Trailer 记录

,和记录每次出现一次,因此将它们的Header和属性保留为默认值。GroupTrailerTrailerMin OccursMax Occurs1

此外,这些记录中的每一个都分别由适当Tag Identifier00和标识。1617

最后,这些记录都以尾随的 CR/LF 对或字符结尾。因此,将它们的Child Delimiter Type属性设置为Hexadecimal,并将它们的Child Order属性设置为Postfix

Type07、Type08、Type09 和 Type10 结构

这是棘手的部分。

查看这些结构的一种方法是它们包含重复记录,每个记录都以尾随 CR/LF 分隔。然而,结构本身只出现一次

另一个重要的一点是,您只需要一个 CR/LF 对作为结构及其子记录的分隔符。因此,Child Delimiter Type属性的设置应该反映这一点。

对于Type07Type08和记录Type09Type10保留默认设置。即,将Child Delimiter Type属性设置为None并将Child Order属性设置为Conditional Default。特别是,这些记录没有Tag Identifier设置。

Type07_Record、Type08_Record、Type09_Record 和 Type10_Record 结构

但是,Type07_RecordType08_RecordType09_RecordType10_Record设置为多次出现。将它们的Min Occurs属性设置为0并将Max Occurs属性设置为unbounded

此外,每个重复记录都以尾随 CR/LF 对结束。因此,将它们的Child Delimiter Type属性设置为Hexadecimal,将它们的Child Order属性设置为 ,将Postfix它们的Child Delimiter属性设置为0x0D 0x0A

参考

作为参考,结果设置为:

  • Root:分隔,无,有条件的默认值。

  • Header: 分隔符、十六进制、0x0D 0x0A、后缀、标签标识符00

  • <Sequence>: (可选) , MinOccurs: 1, MaxOccurs: 1

  • Type07:分隔,无,有条件的默认值。

  • Type07_Record: 分隔符、十六进制、0x0D 0x0A、后缀、标签标识符07

  • Type08:分隔,无,有条件的默认值。

  • Type08_Record: 分隔符、十六进制、0x0D 0x0A、后缀、标签标识符08

  • Type09:分隔,无,有条件的默认值。

  • Type09_Record: 分隔符、十六进制、0x0D 0x0A、后缀、标签标识符09

  • Type10:分隔,无,有条件的默认值。

  • Type10_Record: 分隔符、十六进制、0x0D 0x0A、后缀、标签标识符10

  • GroupTrailer: 分隔符、十六进制、0x0D 0x0A、后缀、标签标识符16

  • Trailer: 分隔符、十六进制、0x0D 0x0A、后缀、标签标识符17

于 2011-03-08T10:11:33.607 回答
0

有几种方法可以解决这个问题。首先,记录级模式节点上有一个属性,允许您忽略/抑制尾随分隔符。但是,如果额外的 /r/n 不是始终如一地出现在您的文件中,您可能会遇到问题。

第二个选项是添加一个没有列且 min=0 和 max=1 的额外记录节点。如果你需要走这条路,我可以为你提供更多细节。

于 2011-02-27T13:19:56.910 回答