使用迭代XQuery转换CSV为XML时遇零长度字符串错误求助
解决XQuery处理CSV转XML时的“Supplied element name is a zero-length string”错误
问题原因
报错核心是生成XML元素时使用了空字符串作为元素名。结合你的场景,生产环境的CSV表头大概率存在以下异常:
- 表头开头/结尾有多余逗号,分割出空字段名
- 表头包含连续逗号,产生空字段名
- 部分字段名本身为空字符串
测试环境的CSV无此类情况,因此运行正常,但生产环境的数千行数据包含上述异常格式,触发了错误。
修复后的XQuery代码
let $lines := tokenize(/result/text(), ' ') let $raw_fieldnames := tokenize($lines[1], '\s*,\s*') -- 为空字段生成带序号的默认名称,避免空元素名 let $fieldnames := for $fn at $pos in $raw_fieldnames return if (normalize-space($fn) eq '') then concat('field_', $pos) else $fn return <results> { for $line at $i in $lines where $i gt 1 and normalize-space($line) ne '' -- 跳过空行,减少无效处理 let $fields := tokenize($line, '\s*,\s*') return <row>{ for $fieldname at $j in $fieldnames -- 兼容行字段数与表头不匹配的情况:字段不足时填空字符串 let $value := if ($j le count($fields)) then fn:replace($fields[$j],'"','') else '' return element {fn:replace($fieldname,' ','_')} {$value} }</row> } </results>
关键修改点
- 空字段名处理:对原始表头的空字段名生成
field_序号格式的默认名称,彻底避免空元素名出现 - 跳过空行:新增判断跳过CSV中的空行,减少无效处理逻辑
- 字段数兼容:新增字段数判断,当某行字段数量少于表头时,对应位置填空字符串,避免索引越界
内容的提问来源于stack exchange,提问作者Punit Patel
相关产品推荐
相关产品推荐

