繁体   English   中英

XML 到 CSV 与 BaseX/XQuery

[英]XML to CSV with BaseX/XQuery

我正在尝试将大量 xml 转换为单个 csv 文件。 xml 的简化结构如下所示:

<Receipts>
    <Receipt>
        <Field1 attribute1="a"/>
        <Fields2>
            <Field2 attribute2="1"/>
            <Field2 attribute2="2"/>
        </Fields2>
        <Field4 attribute4="4a"/>
    </Receipt>
    <Receipt>
        <Field1 attribute1="b"/>
        <Field4 attribute4="4b"/>
    </Receipt>
    <Receipt>
        <Field1 attribute1="c"/>
        <Fields2>
            <Field2 attribute2="3"/>
        </Fields2>
        <Field3 attribute3="c3"/>
        <Field4 attribute4="4c"/>
    </Receipt>
</Receipts>

我想获得的 csv 结果是

Attribute1,Attribute2,Attribute3,Attribute4
a,1,,4a
a,2,,4a
b,,,4b
c,3,c3,4c

我的代码基于这个答案,但我只能在 csv 上为每个连接了所有属性 2 的收据创建一行,或者只返回具有 Fields2 元素和 Field2 的收据,即:要么:

Attribute1,Attribute2,Attribute3,Attribute4
a,1 2,,4a
b,,,4b
c,3,c3,4c

或这个:

Attribute1,Attribute2,Attribute3,Attribute4
a,1,,4a
a,2,,4a
c,3,c3,4c

我的第一种情况的代码是:

declare option output:method "csv";
declare option output:csv "header=yes, separator=comma";

    declare context item := document {<Receipts>
    <Receipt>
        <Field1 attribute1="a"/>
        <Fields2>
            <Field2 attribute2="1"/>
            <Field2 attribute2="2"/>
        </Fields2>
        <Field4 attribute4="4a"/>
    </Receipt>
    <Receipt>
        <Field1 attribute1="b"/>
        <Field4 attribute4="4b"/>
    </Receipt>
    <Receipt>
        <Field1 attribute1="c"/>
        <Fields2>
            <Field2 attribute2="3"/>
        </Fields2>
        <Field3 attribute3="c3"/>
        <Field4 attribute4="4c"/>
    </Receipt>
</Receipts>};



for $x in //Receipt
return 
<csv>
  <record>
    <Attribute1>{$x/Field1/@attribute1/data()}</Attribute1>
    <Attribute2>{$x/Fields2/Field2/@attribute2/data()}</Attribute2>
    <Attribute3>{$x/Field3/@attribute3/data()}</Attribute3>
    <Attribute4>{$x/Field4/@attribute4/data()}</Attribute4>
  </record>
</csv>

对于第二种情况,它将是:

declare option output:method "csv";
declare option output:csv "header=yes, separator=comma";

    declare context item := document {<Receipts>
    <Receipt>
        <Field1 attribute1="a"/>
        <Fields2>
            <Field2 attribute2="1"/>
            <Field2 attribute2="2"/>
        </Fields2>
        <Field4 attribute4="4a"/>
    </Receipt>
    <Receipt>
        <Field1 attribute1="b"/>
        <Field4 attribute4="4b"/>
    </Receipt>
    <Receipt>
        <Field1 attribute1="c"/>
        <Fields2>
            <Field2 attribute2="3"/>
        </Fields2>
        <Field3 attribute3="c3"/>
        <Field4 attribute4="4c"/>
    </Receipt>
</Receipts>};



for $x in //Receipt for $y in $x/Fields2/Field2
return 
<csv>
  <record>
    <Attribute1>{$x/Field1/@attribute1/data()}</Attribute1>
    <Attribute2>{$y/@attribute2/data()}</Attribute2>
    <Attribute3>{$x/Field3/@attribute3/data()}</Attribute3>
    <Attribute4>{$x/Field4/@attribute4/data()}</Attribute4>
  </record>
</csv>

经过更深入的搜索,我找到了解决方案。 在第二个 for 循环的第二个选项上,您应该添加allowing empty的 function,以便代码最终看起来像这样:

declare option output:method "csv";
declare option output:csv "header=yes, separator=comma";

    declare context item := document {<Receipts>
    <Receipt>
        <Field1 attribute1="a"/>
        <Fields2>
            <Field2 attribute2="1"/>
            <Field2 attribute2="2"/>
        </Fields2>
        <Field4 attribute4="4a"/>
    </Receipt>
    <Receipt>
        <Field1 attribute1="b"/>
        <Field4 attribute4="4b"/>
    </Receipt>
    <Receipt>
        <Field1 attribute1="c"/>
        <Fields2>
            <Field2 attribute2="3"/>
        </Fields2>
        <Field3 attribute3="c3"/>
        <Field4 attribute4="4c"/>
    </Receipt>
</Receipts>};



for $x in //Receipt for $y allowing empty in $x/Fields2/Field2
return 
<csv>
  <record>
    <Attribute1>{$x/Field1/@attribute1/data()}</Attribute1>
    <Attribute2>{$y/@attribute2/data()}</Attribute2>
    <Attribute3>{$x/Field3/@attribute3/data()}</Attribute3>
    <Attribute4>{$x/Field4/@attribute4/data()}</Attribute4>
  </record>
</csv>

返回设计者 CSV:

Attribute1,Attribute2,Attribute3,Attribute4
a,1,,4a
a,2,,4a
b,,,4b
c,3,c3,4c

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM