使用XQUERY转换XML到CSV时生成空文件的问题排查
XML转CSV空文件问题排查与解决
问题背景
源XML内容
<?xml version="1.0"?> <Price-Data-Description xmlns:xsi="http://www.ybd3.org/2021/XMLSchema-instance"> <item id="Data_200_PRICE"> <Code>111</Code> <Cur>12</Cur> <Conv>600</Conv> <Data>Float</Data> <Year>1202</Year> <Key>Data100-1202</Key> </item> <item id="Data_100_PRICE"> <Code>100</Code> <Cur>199</Cur> <Conv>900</Conv> <Data>Integer</Data> <Year>1302</Year> <Key>Data200-1202</Key> </item> </Price-Data-Description>
期望输出CSV
Code,Cur,Conv,Data,Year 111,12,600,Float,1202 100,199,900,Integer,1302
原XQuery脚本(生成空文件)
<SerializeToDelimitedContentTask> <filePath></filePath> <fileName>MyFile.csv</fileName> <skipHeaders>false</skipHeaders> { for $i in $input.fileEvent[1]/content//*:item return <customObjects> <Code>{$i/Code/text()}</Code> <Cur>{$i/Cur/text()}</Cur> <Conv>{$i/Conv/text()}</Conv> <Data>{$i/Data/text()}</Data> <Year>{$i/Year/text()}</Year> </customObjects>} <header> <fieldIndex>1</fieldIndex> <name>Code</name> </header> <header> <fieldIndex>2</fieldIndex> <name>Cur</name> </header> <header> <fieldIndex>3</fieldIndex> <name>Conv</name> </header> <header> <fieldIndex>4</fieldIndex> <name>Data</name> </header> <header> <fieldIndex>5</fieldIndex> <name>Year</name> </header> </SerializeToDelimitedContentTask>
问题排查
- 节点结构错误:原脚本循环生成多个
<customObjects>节点,但SerializeToDelimitedContentTask要求单个<customObjects>容器,内部用<customObject>节点承载每行数据。 - 路径匹配问题:
//*:item尝试匹配带命名空间的<item>节点,但源XML中<item>属于无命名空间元素,应该用//item直接匹配;同时需确保$input.fileEvent[1]/content正确指向XML内容根节点。
修正后的XQuery脚本
<SerializeToDelimitedContentTask> <filePath></filePath> <fileName>MyFile.csv</fileName> <skipHeaders>false</skipHeaders> <customObjects> { for $i in $input.fileEvent[1]/content//item return <customObject> <Code>{$i/Code/text()}</Code> <Cur>{$i/Cur/text()}</Cur> <Conv>{$i/Conv/text()}</Conv> <Data>{$i/Data/text()}</Data> <Year>{$i/Year/text()}</Year> </customObject> } </customObjects> <header> <fieldIndex>1</fieldIndex> <name>Code</name> </header> <header> <fieldIndex>2</fieldIndex> <name>Cur</name> </header> <header> <fieldIndex>3</fieldIndex> <name>Conv</name> </header> <header> <fieldIndex>4</fieldIndex> <name>Data</name> </header> <header> <fieldIndex>5</fieldIndex> <name>Year</name> </header> </SerializeToDelimitedContentTask>
验证结果
修正后的脚本会正确遍历源XML中的所有<item>节点,生成符合预期的CSV文件,内容与需求完全一致。
内容的提问来源于stack exchange,提问作者TAN08
相关产品推荐
相关产品推荐

