首页 > 解决方案 > 使用 Liquid Data Mapper 将 XML 转换为带有数据头的 CSV

问题描述

我有一个描述标题和列表的 XML 文件。我需要生成一个 CSV 文件,其中文件的第一行是从标题信息构造的,文件的后续行是从列表构造的。标题与列表项的列数不同。

使用 xsl 很容易做到这一点。如何使用 .NET 映射引擎对数据映射器进行操作?

一个简单的例子来解释。输入 xml 的 XSD

<xs:element name="Root">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="A" />
            <xs:element name="B" />
            <xs:element name="Line" maxOccurs="unbounded">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element name="C" />
                        <xs:element name="D" />
                        <xs:element name="E" />
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
        </xs:sequence>
    </xs:complexType>
</xs:element>

输入 XML 示例

 <Root>
     <A>Header Value</A>
     <B>112233</B>
     <Line>
         <C>22</C>
         <D>Fred</D>
         <E>1</E>
     </Line>
     <Line>
         <C>34</C>
         <D>Jim</D>
         <E>2</E>
     </Line>
     <Line>
         <C>42</C>
         <D>Amanda</D>
         <E>1</E>
     </Line>
     <Line>
         <C>1267</C>
         <D>Vickie</D>
         <E>2</E>
     </Line>
 </Root>

所需的文本输出:

 Header Value|112233
 22|Fred|1
 34|Jim|2
 42|Amanda|1
 1267|Vickie|2

生成任一

 Header Value|112233

或者

 22|Fred|1
 34|Jim|2
 42|Amanda|1
 1267|Vickie|2

由于单个 csv 文件很容易(应该如此),但是除了求助于 xslt 之外,我怎么看不到如何生成所需的文件。

标签: liquid-xml

解决方案


如果您希望能够动态设置标题,您可以设置一个看起来像这样的转换。

在此处输入图像描述

您使用“复制”选项将“行”输入加倍

在此处输入图像描述

在你这样做之前,你需要调整你的架构。输入值 AE 需要输入(注意type="xs:string")。

<?xml version="1.0" encoding="utf-8" ?>
<!--Created with Liquid Studio 2019 (https://www.liquid-technologies.com)-->
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="Root">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="A" type="xs:string" />
                <xs:element name="B" type="xs:string" />
                <xs:element name="Line" maxOccurs="unbounded">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="C" type="xs:string" />
                            <xs:element name="D" type="xs:string" />
                            <xs:element name="E" type="xs:string" />
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

这将为您提供如下所示的输出数据(请注意,它始终输出 3 列,因此您会得到一个尾随的“|”)。

Header Value|112233|
22|Fred|1
34|Jim|2
42|Amanda|1
1267|Vickie|2

如果您只想要数据而没有标题,那么您可以像这样连接它

在此处输入图像描述


推荐阅读