BizTalk解析仅表头无数据行CSV报Unexpected end of stream错误
问题根因
报错的核心原因是数据行Row节点的最小出现次数默认是1,属于必选节点。平面文件解析器读完表头行、匹配到表头末尾的CRLF分隔符后,会强制要求至少存在1条数据行,于是开始查找数据行的第一个字段分隔符逗号,此时直接碰到流末尾,就抛出了找不到逗号的意外流结束错误。
你之前调整的allow_early_termination、suppress_empty_nodes仅作用于字段级的分隔匹配和空节点处理,无法控制记录节点的可选/必选属性,所以修改后没有效果。
修复方法
只需要调整Row节点的最小出现次数配置即可,两种操作方式选一种:
- 可视化编辑器操作:在Visual Studio中打开该平面文件架构,选中
Row记录节点,在属性面板将Min Occurs属性值从默认的1改为0,保存架构后重新部署到BizTalk即可。 - 直接修改XSD代码:找到Row节点的定义行,添加
minOccurs="0"属性,修改后的节点定义如下:
<xs:element minOccurs="0" maxOccurs="unbounded" name="Row"> <xs:annotation> <xs:appinfo> <b:recordInfo structure="delimited" child_delimiter_type="char" child_delimiter="," child_order="infix" sequence_number="2" preserve_delimiter_for_empty_data="true" suppress_trailing_delimiters="false" /> </xs:appinfo> </xs:annotation> <!-- 剩余原有Row节点内部配置保持不变 --> </xs:element>
验证说明
修改后所有合法CSV场景都可正常解析,不会影响原有业务逻辑:
- 仅含表头行(表头末尾带CRLF、无数据行):解析后仅生成Header节点,无Row节点,不再抛错
- 含1条及以上数据行:解析逻辑和修改前完全一致
- 末尾无CRLF的不规范CSV文件:你之前开启的
allow_early_termination配置会自动兼容,不会触发解析错误
内容的提问来源于stack exchange,提问作者NealWalters
相关产品推荐
相关产品推荐

