XQuery解析CSV
精华
小牛编辑
186浏览
2023-03-14
如果希望将逗号分隔值(CSV)文本的文件解析为xml结构,或者有一个具有非常相似的行/字段结构的平面文件,希望将其转换为XML格式。
这里将使用tokenize($input, '\n')
函数将输入文件分成不同的行。 然后将使用tokenize($input, ',')
函数将每一行解析为单独的字段。 请注意,tokenize()
将删除前导和尾随空格。
基本例子
let $csv-input-sample :=
'John, Smith, x123
Peg, Jones , x456
Sue, Adams , x789
Dan, McCoy , x321'
let $lines := tokenize($csv-input-sample, '\n')
return
<results>{
for $line in $lines
let $fields := tokenize($line, ',')
return
<row>{
for $field in $fields
return
<field>{$field}</field>
}</row>
}</results>
输出结果 -
<results>
<row>
<field>John</field>
<field>Smith</field>
<field>x123</field>
</row>
<row>
<field>Peg</field>
<field>Jones</field>
<field>x456</field>
</row>
<row>
<field>Sue</field>
<field>Adams</field>
<field>x789</field>
</row>
<row>
<field>Dan</field>
<field>McCoy</field>
<field>x321</field>
</row>
</results>
第1行中的数据字典示例
第二个示例将使用CSV文件的第一行作为每行每列的元素名称的数据字典。
let $csv :=
'name,faculty
alice,anthropology
bob,biology'
let $lines := tokenize($csv, '\n')
let $head := tokenize($lines[1], ',')
let $body := remove($lines, 1)
return
<people>
{
for $line in $body
let $fields := tokenize($line, ',')
return
<person>
{
for $key at $pos in $head
let $value := $fields[$pos]
return
element { $key } { $value }
}
</person>
}
</people>
输出结果如下 -
<people>
<person>
<name>alice</name>
<faculty>anthropology</faculty>
</person>
<person>
<name>bob</name>
<faculty>biology</faculty>
</person>
</people>