65.9K
CodeProject 正在变化。 阅读更多。
Home

Cinchoo ETL - 从大型 XML 文件中反序列化选择的 XML 节点

starIconstarIconstarIconemptyStarIconemptyStarIcon

3.00/5 (1投票)

2021 年 11 月 7 日

CPOL

2分钟阅读

viewsIcon

3766

使用 Cinchoo ETL 从大型 XML 文件中反序列化选择的 XML 节点

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 日:初始版本
© . All rights reserved.