目录
1、简介
2. 要求
3. 如何使用
3.1 样本数据
3.2 安装库
3.3 快速转换
3.4 为子节点添加不同的XML命名空间
- 下载 Cinchoo ETL 源码
- 下载 Cinchoo ETL 二进制文件 (.NET Core)
- 下载 Cinchoo ETL 二进制文件 (.NET Framework)
- 工作示例 1(.NET Fiddle)
- 工作示例 2 (.NET Fiddle)
ChoETL是一个用于.NET的开源ETL(提取、转换和加载)框架。它是一个基于代码的库,用于在.NET环境中从多个来源提取数据、转换并加载到您自己的数据仓库中。您可以立即在数据仓库中获取数据。
本技巧讨论了使用Cinchoo ETL框架将JSON转换为带有名称空间的XML。使用非常简单,几行代码就可以完成转换。您可以转换大文件,因为转换过程是基于流的,速度非常快且内存占用少。
2. 要求该框架库是使用.NET 4.5/.NET Core 3.x框架用C#编写的。
3. 如何使用 3.1 样本数据让我们从以下包含复杂嵌套结构的JSON文件开始。比如说,我们有两家公司,第一家有两个分公司,第二家只有一个分公司。
清单 3.1.1 示例JSON文件 (items.json)
{
"item": {
"name": "item #1"
"code": "itm-123"
"image": {
"@url": "http://www.foo.com/bar.jpg"
"title": "bar"
}
}
}
预期的 JSON 输出如下所示:
清单 3.1.2 XML 输出文件 (items.xml)
item #1
itm-123
bar
接下来,安装ChoETL.JSON/ChoETL.JSON.NETStandard nuget包。为此,请在包管理器控制台中运行以下命令。
.NET Standard Framework
Install-Package ChoETL.JSON
.NET Core
Install-Package ChoETL.JSON.NETStandard
现在将ChoETL命名空间添加到程序中。
using ChoETL;
让我们使用该库将复杂的结构化JSON转换为带有命名空间的XML。它很简单,只需几行代码即可完成。不需要POCO类。它速度快、基于流且占用内存少。
清单 3.3.1 快速JSON文件转换
private static void QuickConversion()
{
using (var r = new ChoJSONReader.LoadText("items.json"))
{
using (var w = new ChoXmlWriter("items.xml")
.IgnoreRootName()
.IgnoreNodeName()
.WithDefaultXmlNamespace("foo", "http://foo.com")
)
{
w.Write(r);
}
}
}
创建用于生成XML(items.xml )输出文件的ChoXmlWriter实例。然后创建一个ChoJSONReader对象实例来读取复杂的JSON(items.json)文件。
其中:
- IgnoreRootName()——告诉writer不要输出根元素
- IgnoreNodeName()——告诉writer不要输出节点元素
- WithDefaultXmlNamespace("foo", "http://foo.com")——告诉writer默认使用为所有节点传递的XML命名空间
Fiddle示例:https ://dotnetfiddle.net/MITsuL
3.4 为子节点添加不同的XML命名空间此示例将展示如何将不同的XML命名空间添加到子节点而不是根节点。在这里,您将看到如何将“http://temp.com”添加到image节点。
清单 3.4.1 向子节点添加不同的XML命名空间
private static void AddDifferentNamespaceToSubnode()
{
using (var r = new ChoJSONReader("items.json"))
{
using (var w = new ChoXmlWriter("items.xml")
.IgnoreRootName()
.IgnoreNodeName()
.WithDefaultXmlNamespace("foo", "http://foo.com")
.WithXmlNamespace("temp", "http://temp.com")
)
{
w.Write(r.Select(rec =>
{
rec.item.image.AddNamespace("temp", "http://temp.com");
return rec;
}
)
);
}
}
}
创建一个用于生成扁平化JSON(company_out.json)输出文件的ChoJSONWriter实例。然后创建一个ChoJSONReader对象实例来读取复杂的JSON (company.json)文件。
在其中:
- IgnoreRootName()——告诉writer不要输出根元素
- IgnoreNodeName()——告诉writer不要输出节点元素
- WithDefaultXmlNamespace("foo", "http://foo.com")- 告诉writer使用传递的XML命名空间作为所有节点的默认名称
- WithXmlNamespace("temp", "http://temp.com")——告诉writer使用传递的XML命名空间作为所有子节点及其子节点的附加命名空间。
- AddNamespace("temp", "http://temp.com")——使用此方法对子节点指定要使用的XML命名空间。
运行代码后将生成以下XML输出。
清单 3.4.2 XML 输出具有不同XML命名空间的子节点
item #1
itm-123
bar
Fiddle示例:https ://dotnetfiddle.net/OO0fpx
https://www.codeproject.com/Tips/5316145/Cinchoo-ETL-Converting-JSON-to-XML-with-Namespaces