Cinchoo ETL - 从大型 XML 文件中反序列化选择的 XML 节点
使用 Cinchoo ETL 从大型 XML 文件中反序列化选择的 XML 节点
- 下载 Cinchoo ETL 源代码
- 下载 Cinchoo ETL 二进制文件 (.NET Core)
- 下载 Cinchoo ETL 二进制文件 (.NET Framework)
- 工作示例 1 (.NET Fiddle)
1. 引言
ChoETL 是一个用于 .NET 的开源 ETL(提取、转换和加载)框架。它是一个基于代码的库,用于从多个来源提取数据,进行转换,并将其加载到 .NET 环境中的您自己的数据仓库中。您可以很快地将数据放入数据仓库中。
本文讨论了使用 Cinchoo ETL 框架从大型 XML 文件中反序列化选择的 XML 节点。它非常易于使用,只需几行代码,就可以完成转换。由于转换过程是基于流的,速度很快且内存占用量低,因此您可以转换大型文件。
2. 要求
这个框架库是用 C# 编写的,使用 .NET 4.5 / .NET Core 3.x 框架。
3. 如何使用
3.1 示例数据
让我们首先查看下面的示例 XML 文件。假设 XML 文件很大,这里,address
节点被重复,并且想要将它们反序列化为对象模型。
列表 3.1.1. Xml 文件 (sample.xml)
<Sites>
<PostCodeValidatedSite>
<Address>
<ALK>A00067262524</ALK>
<BuildingName>1 The Pavilions</BuildingName>
<CSSDistrictCode>CM</CSSDistrictCode>
<ExchangeCode>SOL</ExchangeCode>
<IsPostCodeValid>true</IsPostCodeValid>
<Locality>Shirley</Locality>
<PostCode>B90 4SB</PostCode>
<PostTown>Solihull</PostTown>
<Qualifier>Gold</Qualifier>
<Street>Cranmore Drive</Street>
<Technologies>
<Technology>
<IsAssociated>true</IsAssociated>
<IsRestricted>false</IsRestricted>
<Name>Copper</Name>
</Technology>
<Technology>
<IsAssociated>true</IsAssociated>
<IsRestricted>false</IsRestricted>
<Name>PointToPointFibre</Name>
</Technology>
<Technology>
<IsAssociated>false</IsAssociated>
<IsRestricted>false</IsRestricted>
<Name>FTTPBrownfield</Name>
</Technology>
<Technology>
<IsAssociated>false</IsAssociated>
<IsRestricted>false</IsRestricted>
<Name>FTTPGreenfield</Name>
</Technology>
</Technologies>
</Address>
<Coordinates>
<Easting>413358</Easting>
<Latitude>52.39657</Latitude>
<Longitude>-1.79875</Longitude>
<Northing>278082</Northing>
</Coordinates>
</PostCodeValidatedSite>
<PostCodeValidatedSite>
<Address>
<ALK>A15100427347</ALK>
<BuildingName>1 The Pavilions</BuildingName>
<CSSDistrictCode>CM</CSSDistrictCode>
<ExchangeCode>SOL</ExchangeCode>
<IsPostCodeValid>true</IsPostCodeValid>
<Locality>Shirley</Locality>
<PostCode>B90 4SB</PostCode>
<PostTown>Solihull</PostTown>
<Qualifier>Gold</Qualifier>
<Street>Cranmore Drive</Street>
<SubBuilding>Floor 001-Room Comm</SubBuilding>
<Technologies>
<Technology>
<IsAssociated>false</IsAssociated>
<IsRestricted>false</IsRestricted>
<Name>Copper</Name>
</Technology>
<Technology>
<IsAssociated>true</IsAssociated>
<IsRestricted>false</IsRestricted>
<Name>PointToPointFibre</Name>
</Technology>
<Technology>
<IsAssociated>false</IsAssociated>
<IsRestricted>false</IsRestricted>
<Name>FTTPBrownfield</Name>
</Technology>
<Technology>
<IsAssociated>false</IsAssociated>
<IsRestricted>false</IsRestricted>
<Name>FTTPGreenfield</Name>
</Technology></Technologies>
</Address>
<Coordinates>
<Easting>413358</Easting>
<Latitude>52.39657</Latitude>
<Longitude>-1.79875</Longitude>
<Northing>278082</Northing>
</Coordinates>
</PostCodeValidatedSite>
</Sites>
首先要做的是安装 ChoETL /ChoETL.NETStandard
nuget 包。为此,请在包管理器控制台中运行以下命令。
.NET Framework
Install-Package ChoETL
.NET Core
Install-Package ChoETL.NETStandard
现在将 ChoETL
命名空间添加到程序。
using ChoETL;
3.2 反序列化操作
由于 XML 文件可能很大,我们需要考虑以流模型反序列化 address
节点,而不是将整个文件加载到内存中,以避免内存压力。
定义与 address XML 节点匹配的 Address
对象模型。
列表 3.2.1. Address 类模型
public class Address
{
[XmlElement("ALK")]
public string ALK { get; set; }
[XmlElement("BuildingName")]
public string BuildingName { get; set; }
[XmlElement("CSSDistrictCode")]
public string CSSDistrictCode { get; set; }
[XmlElement("IsPostCodeValid")]
public Boolean IsPostCodeValid { get; set; }
[XmlElement("Locality")]
public string Locality { get; set; }
[XmlElement("PostCode")]
public string PostCode { get; set; }
[XmlElement("PostTown")]
public string PostTown { get; set; }
[XmlElement("Qualifier")]
public string Qualifier { get; set; }
[XmlElement("Street")]
public string Street { get; set; }
}
然后使用 Cinchoo ETL 库使用 WithXPath()
方法提取 address 节点,并将它们反序列化为如下所示的 address 对象模型。
列表 3.2.2. 解析 XML 文件
public static void Main()
{
using (var r = new ChoXmlReader<Address>("sample.xml").WithXPath("//Address"))
{
r.Print();
}
}
示例 fiddle: https://dotnetfiddle.net/Jg1lUv
有关 Cinchoo ETL 的更多信息,请访问其他 CodeProject 文章。
历史
- 2021 年 11 月 7 日:初始版本