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