BizTalk 2010仅使用functoid解析字符串中的数据

BizTalk 2010仅使用functoid解析字符串中的数据,biztalk,biztalk-2010,Biztalk,Biztalk 2010,我在一个入站EDI文件中获取数据,其中一个字段有我需要从单个字符串中解析出来的度量值。该字段的一个示例是: 11.75x21.25x41.37x 我需要将第一个X前面的所有值推送到目标字段(比如长度),将第一个X和第二个X之间的所有值推送到目标字段“宽度”,并将第二个X和第三个X之间的所有数据发送到目标字段“高度” 这是一个挑战:是否可以只使用functoid而不使用C#代码?这是首选,因为如果客户机修改X之间的数据格式(他们很可能会这样做),如果不需要修改、检查、存储代码并将其推送到服务器,那

我在一个入站EDI文件中获取数据,其中一个字段有我需要从单个字符串中解析出来的度量值。该字段的一个示例是:

11.75x21.25x41.37x

我需要将第一个X前面的所有值推送到目标字段(比如长度),将第一个X和第二个X之间的所有值推送到目标字段“宽度”,并将第二个X和第三个X之间的所有数据发送到目标字段“高度”

这是一个挑战:是否可以只使用functoid而不使用C#代码?这是首选,因为如果客户机修改X之间的数据格式(他们很可能会这样做),如果不需要修改、检查、存储代码并将其推送到服务器,那么管理C#代码更容易维护


我尝试使用字符串修剪和字符串精确functoid,但没有成功;在X和I之间没有固定的位数,我甚至不能保证总是有小数——这是我最初想输入的另一个特性。唯一的常量将是X。

是的,你可以只使用functoid来实现这一点-但是如果你人为地规定你不使用C#(在脚本functoid中),那么你会让生活变得更加艰难,并且不会解决你认为你正在解决的问题

您必须使用多个
String Find
functoid来选择字段的各个部分-这将只在您知道可以提前发生的
x
e的数量的情况下起作用。对于字符串查找,第一个输入是节点,第二个输入是
x
,然后将其连接到
字符串提取
functoid。要获得第二个,您必须堆叠
字符串Find
functoid,这样生活就会变得丑陋。您实际上是在尝试使用BizTalk functoid手动构建递归

底线是:无论您如何实现这一点,如果客户端更改字符串的格式,您必须更改解析逻辑才能将其导出。通过编写自定义functoid(或只是一个外部汇编方法),该逻辑将更易于管理,其核心功能是:

公共字符串StringPartAt(字符串s、字符串sep、int idx)
{
字符串[]splits=s.Split(sep[0]);
如果(拆分长度>idx)
返回拆分[idx];
返回“”;
}
这将更易于维护和理解。您可以在脚本functoid中设置它,并传入节点,
x
,以及一个从零开始的索引,以获取字符串,并根据需要多次使用它来拆分内容。您甚至可以添加错误处理/日志记录(
“警告:尝试提取超出输入范围的值”
,请在事件日志中添加)。如果您担心客户端的C#功能,也可以用VB或JavaScript编写。即使在自定义XSLT中,它也会更容易(多次使用
substring-before()
,或者构建一个递归模板),这比尝试拼凑一组常用functoid来完成此任务要好

这是如何工作的图片(使用内联C#演示-您可能希望在外部程序集或自定义functoid中使用它以实现可重用性;请注意,
char
不能实际使用,您必须使用如上所示的字符串):


事实证明,我们必须为每个值(高度、宽度和长度)使用不同的脚本才能从字符串中提取这些值。使用以下C#脚本将每个脚本放入脚本函数中对我的地图有效:

长度:

   public decimal getLength(string weights)
    {
        string[] wgt;
        wgt = weights.Split('x');
        decimal len = Convert.ToDecimal(wgt[0]);
        decimal wid = Convert.ToDecimal(wgt[1]);
        decimal hgt = Convert.ToDecimal(wgt[2]);

        return len;
    }
宽度:

    public decimal getWidth(string weights)
    {
        string[] wgt;
        wgt = weights.Split('x');
        decimal len = Convert.ToDecimal(wgt[0]);
        decimal wid = Convert.ToDecimal(wgt[1]);
        decimal hgt = Convert.ToDecimal(wgt[2]);

        return wid;
    }
高度:

    public decimal getHeight(string weights)
    {
        string[] wgt;
        wgt = weights.Split('x');
        decimal len = Convert.ToDecimal(wgt[0]);
        decimal wid = Convert.ToDecimal(wgt[1]);
        decimal hgt = Convert.ToDecimal(wgt[2]);

        return hgt;
    }

好的,我可以在脚本Functoid中使用该脚本,但是如何传入执行该脚本和获取数据所需的3个值呢?如果我理解正确,字符串将是从该节点指向的数据源,而字符sep将始终是“X”。但是,我如何告诉它获取“仅第一个X之前的值”或“仅第一个X之后和第二个X之前的值”或“第二个X和第三个X之间的值”?很抱歉,我不知道C#以及这里的其他人,因此我最初尝试用Functoids解决这个问题。提前感谢您——第一个输入是您的节点,第二个输入是“x”(字符分隔符),第三个输入是您想要的索引。因此,要获得第一个x,您需要传递
,x,0
,要获得第一个和第二个之间的值,您需要使用
,x,1
,等等。因此,下面字段值的第一部分的代码是:添加了一些图片,希望清除它。还忘记了不能在XSLT中使用
char
参数或返回类型,需要使用字符串并从中获取
char
。更好的函数将检查该字符串是否只有一个字符,delimter是否存在,等等。