liquid-xml - 使用 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 之外,我怎么看不到如何生成所需的文件。
解决方案
如果您希望能够动态设置标题,您可以设置一个看起来像这样的转换。
您使用“复制”选项将“行”输入加倍
在你这样做之前,你需要调整你的架构。输入值 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
如果您只想要数据而没有标题,那么您可以像这样连接它
推荐阅读
- c# - 如何使用 ASP.Net MVC 显示文件的文件名和下载链接?
- mongodb - 在 MongoDB 查询中仅对几个字段进行分组和保留
- python - 'NoneType' 对象不可下标 - 我该如何解决这个错误
- python - Discord.Py:CommandOnCooldown 提高 CommandOnCooldown(bucket, retry_after)
- list - 如何从颤动的列表映射堆栈中恢复已删除的数据项
- java - Java UDP 使用线程发送/接收数据包
- python - 我不能在heroku上用python制作文件
- multithreading - 在 Delphi 中释放 TCriticalSection 对象的正确方法
- python - 热修复eventstudy股票价格的错误
- javascript - 如何让浏览器保存未屏蔽的密码输入?