都 2021 年了,竟然有人搞大数据时忽略 JSON 而去研究用 C# 把 XML 转换为 XML 的技术...

在大数据项目开发过程中,ETL(Extract-Transform-Load)是必不可少。即便目前 JSON 非常流行,开发人员也有必定会有对远古系统的挑战,而 XML 格式的数据源作为经典存在浑身上下散发着浓浓 old money 的味道。

因为有 Newtonsoft.Json 这样优秀的 JSON 框架存在,开发人员可以很容易的对 JSON 格式的字符串反序列化。但是 XML 格式的数据就没有这么方便了:虽然 .NET 中内置了对 XML 序列化和反序列化的支持,但遇到需要对接外部数据时就不是很方便了。

使用 XmlReader 读取数据

从 XML 中提取目标数据最高效,也最麻烦的方式是直接使用 XmlReader :

<employee xmlns="urn:empl-hire"><ID>12365</ID><hire-date>2003-01-08</hire-date><title>Accountant</title>
</employee>

使用以下代码对上述 hireDate.xml 文件读取:

using (XmlReader reader = XmlReader.Create("hireDate.xml")) {// Move to the hire-date element.reader.MoveToContent();reader.ReadToDescendant("hire-date");// Return the hire-date as a DateTime object.DateTime hireDate = reader.ReadElementContentAsDateTime();Console.WriteLine("Six Month Review Date: {0}", hireDate.AddMonths(6));
}

输出:

Six Month Review Date:  7/8/2003 12:00:00 AM

使用 XDocument 读取数据

在 .NET Framework 3.5 发布后的时间里,开发人员可以使用 XDocument 来生成和解析 XML 文档,这要比 XmlReader 方便的多:

string str =
@"<?xml version=""1.0""?>  
<!-- comment at the root level -->  
<Root>  <Child>Content</Child>  
</Root>";
XDocument doc = XDocument.Parse(str);
Console.WriteLine(doc.XPathSelectElement("//Child"));

输出:

<Child>Content</Child>

但硬编码的 XPath 并不方便调试,而且需要时刻关注空引用的问题。在 XML 格式复杂、项目工程比较大时使用起来也不方便。

一种把 XML 转换为 XML 的技术:XSLT

在计算机科学中,可扩展样式表转换语言(英语:Extensible Stylesheet Language Transformations,缩写XSLT)是一种样式转换标记语言,可以将XML数据档转换为另外的XML或其它格式,如HTML网页,纯文字。XSLT最末的T字母表示英语中的“转换”(transformation)。

简单来说,开发人员可以借助 XSLT 技术编写一个 XML 文件,并使用该文件将一种 XML 格式转换为另一种 XML 。即:在对接复杂格式 XML 数据源时,开发人员可以编写一个后缀为 .xsl 的文件,并使用该文件将数据源格式转换为自己需要的格式(比如可以适配 XML 反序列化的格式)。

从一个简单的 XML 文件开始:

<?xml version="1.0" encoding="ISO-8859-1"?>
<catalog><cd><title>Empire Burlesque</title><artist>Bob Dylan</artist><country>USA</country><company>Columbia</company><price>10.90</price><year>1985</year></cd>
.
.
.
</catalog>

如果直接在浏览器打开这个文件:

假设我们只关心所有的 title 信息,可以使用下面的 cdcatalog.xsl 文件,该文件可以将 cdcatalog.xml 转为 XmlSerializer 所需要的格式:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"><xsl:output method="xml" indent="yes"/><xsl:template match="/"><ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><xsl:for-each select="catalog/cd"><string><xsl:value-of select="title"/></string></xsl:for-each></ArrayOfString></xsl:template>
</xsl:stylesheet>

为了可以在浏览器中直接观察到转换效果,可以选择把 XSL 样式表链接到 XML 文档:向 XML 文档(”cdcatalog.xml”)添加 XSL 样式表引用即可。

<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="cdcatalog.xsl"?>
<catalog><cd><title>Empire Burlesque</title><artist>Bob Dylan</artist><country>USA</country><company>Columbia</company><price>10.90</price><year>1985</year></cd>
.
.
.
</catalog>

刷新浏览器,打开开发者工具:

也可以在:https://www.coderbusy.com/demos/2021/1531/cdcatalog.xml 查看在线示例。

从上面的操作可以看出,调试 XLS 文件的成本是很低的,开发者可以很容易对 XLS 文件进行更改,并在短时间之内得到运行结果。

在 C# 中使用 XSLT 技术

在 C# 中,可以使用 XslCompiledTransform 进行 XSL 转换。以下代码展示这个转换过程:

XslCompiledTransform xsl = new XslCompiledTransform();
xsl.Load("cdcatalog.xsl");
var sb = new StringBuilder();
using (var sw = new StringWriter(sb))
{using (var xw = new XmlTextWriter(sw) { Formatting = Formatting.Indented }){xsl.Transform("cdcatalog.xml", xw);}
}var xml = sb.ToString();
Console.WriteLine(xml);

以上代码会产生如下输出:

<ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><string>Empire Burlesque</string><string>Hide your heart</string><string>Greatest Hits</string><string>Still got the blues</string><string>Eros</string>
.
.
.
</ArrayOfString>

反序列化 XML 字符串

转换 XML 不是目的,能直接拿到数据对象才是。以上的代码完成了格式转换,接着需要对转换好的 XML 字符串反序列化:

var xmlSerializer = new XmlSerializer(typeof(List<string>));
using (var ms = new MemoryStream(Encoding.UTF8.GetBytes(xml)))
{var list = (List<string>) xmlSerializer.Deserialize(ms);foreach (var item in list){Console.WriteLine(item);}
}

以上代码借助 XmlSerializer 实现了反序列化功能,这会产生以下输出:

Empire Burlesque
Hide your heart
Greatest Hits
Still got the blues
Eros
...

总结与源码

本文所述的转换和反序列化技术已经在真实的生产环境中得到验证,千万级的数据处理也毫不费力。

本文包含的演示的代码和数据可以在 Gitee 上找到:https://gitee.com/coderbusy/demo/tree/master/hello-xslt/HelloXslt 。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/302142.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

新一代来袭︱不只是舒适,简直是享受,Google公司用的腰靠,到底有什么秘密?...

之前小木推荐“德国MINICUTE人体工学腰垫”受到了大家一致的好评和争相购买。小木为什么推荐这一款原因是&#xff1a;据统计&#xff0c;我国腰椎病患者已经突破2亿人。30~40岁人群中&#xff0c;患有颈腰椎病的占比59.1%&#xff01;而且有着越来越年轻化的趋势&#xff0c;办…

微软放弃IE浏览器 应尽快完成国产化替代

不久前&#xff0c;微软决定在2022年6月15日彻底放弃IE浏览器&#xff0c;全线改用Microsoft Edge。微软官方表示&#xff0c;"我们宣布&#xff0c;Windows 10上的Internet Explorer的未来在Microsoft Edge中&#xff0c;Internet Explorer 11桌面应用程序将于2022年6月1…

各种流行的编程风格

2019独角兽企业重金招聘Python工程师标准>>> 在过去的N年中&#xff0c;我遇到了很多使用囧然不同风格的开发者&#xff0c;下面是我所知道的一些&#xff0c;你还知道其它的吗&#xff1f; 散弹枪编程 这种编程风格是一种开发者使用非常随意的方式对待代码。“嗯&a…

没有标题,配得上这款“俄罗斯方块”

在之前的文章时&#xff0c;马斯提到数学存在一种现象叫“梯次掉队”&#xff0c;原因在于孩子的数学思维地基没有打牢。&#xff08;传送门&#xff09;提到初中孩子需要空间想象能力时&#xff0c;很多父母疑惑为何需要&#xff1f;关于这点&#xff0c;小木给大家说明下&…

linux仿真速度快吗,Linux上安装使用最快的GPU加速的终端仿真器Alacritty

这个简单的教程展示了如何通过PPA在Ubuntu 20.04, Ubuntu 20.10, Linux Mint 20中安装最快的终端模拟器Alacritty。Alacritty是一个跨平台、GPU加速的终端模拟器&#xff0c;是现有最快的终端模拟器。可以在macOS、Linux、BSD和Windows上工作。它是一款专注于简单性和性能的免费…

使用c#接入华为云-内容审核

背景内容审核&#xff08;Content Moderation&#xff09;&#xff0c;是基于图像、文本、音视频的检测技术&#xff0c;可自动检测涉黄、涉政涉暴、涉政敏感人物、图文违规等内容&#xff0c;对用户上传的图片、文字、音视频进行内容审核&#xff0c;以满足上传要求&#xff0…

16个让你烧脑让你晕的悖论

全世界只有3.14 % 的人关注了数据与算法之美【1】我知我无知苏格拉底有句名言&#xff1a;“我只知道一件事&#xff0c;那就是我一无所知。”这个说法本身就是悖论&#xff0c;展现了自我参照的表述&#xff08;self-referential statement&#xff09;的复杂性。而这也是西方…

【Paddle 经验分享】利用PaddleHub 2.x 完成文本分类训练的坑

CSDN原文链接&#xff1a;https://blog.csdn.net/kinfey/article/details/117254781基于项目选择了PaddlePaddle 作为文本分类的基础&#xff0c;经过一周多的使用终于有所进展&#xff0c;把文本分类的相关工作做了一个简单模型。首先说说PaddlePaddle , 现在做深度学习&#…

Python的这几个常用库,你会用吗?

目前&#xff0c;人工智能的应用日渐广泛。而作为人工智能核心的机器学习&#xff0c;是一门多领域的交叉学科&#xff0c;专门研究计算机模拟或实现人类学习行为的方法&#xff0c;以获取新的知识或技能&#xff0c;重新组织已有的知识结构使之不断改善自身的性能。简单来说&a…

记一次 .NET 某电商交易平台Web站 CPU爆高分析

一&#xff1a;背景 1. 讲故事已经连续写了几篇关于内存暴涨的真实案例&#xff0c;有点麻木了&#xff0c;这篇换个口味&#xff0c;分享一个 CPU爆高 的案例&#xff0c;前段时间有位朋友在 wx 上找到我&#xff0c;说他的一个老项目经常收到 CPU > 90% 的告警信息&#x…

c语言输入n个数按大小输出,输入n个整数并输出,用c语言表达

FOSS//这个是用静态数组储存整数#includeint main(void){int a[100],i0,j;//如果n小于100的话就不需要用动态数组&#xff0c;或者你可以把100改成更大的数&#xff0c;比如100000000......printf("请输入你要输入的数字&#xff0c;以ctrlz结束:");while(scanf(&quo…

ML.NET Cookbook:(5)如何查看中间过程数据?

通常&#xff0c;当我们构建实验时&#xff0c;我们希望确保“到某一时刻”的数据处理产生我们想要的结果。对于ML.NET来说&#xff0c;这不是很容易做到的&#xff1a;因为所有的ML.NET操作都是延迟执行的&#xff0c;所以我们构造的对象只是数据的“承诺”。我们需要创建游标…

在线交友背后的数学原理

全世界只有3.14 % 的人关注了数据与算法之美欣赏 TED-Ed 带字幕视频, 或者看下面编写的文字版. 01交友网站的背后是算法帝国大家好&#xff0c;我叫 Christian Rudder,我是 OKCupid 网站的创办人之一。这个网站现在已经是全美最大的交友网站。就象这网站上大多数其他人一样,我…

你不得不知道的Visual Studio 2012(3)- 创建Windows应用程序

创建项目 在Visual Studio中创建一个应用程序&#xff0c;应首先创建一个项和一个解决方案。在此示例中&#xff0c;您将创建Windows presentation foundation应用程序。 创建 WPF 项目 在菜单栏上&#xff0c;依次选择 *** 文件 ***&#xff0c;新建&#xff0c;项目。 选择V…

超级智能玩具《小小机器人》|全新50种玩法,创造力之源

致砖《小小机器人》全新套装电动机械的完美结合先来看看视频过过眼瘾吧来自美国STEAM教育让孩子跨学科学知识积木向来是STEAM教育很重要的一部分&#xff0c;因为它涉及到了多种学科&#xff1a;要搭建得稳固——这是工程学&#xff1b;要精准搭建——这是数学&#xff1b;要外…

强烈推荐!孩子的科普从这套全球畅销250万册的最酷科学书起步

在马斯的学生时代的记忆中&#xff0c;数学定义定理、化学方程式、物理公式……这些科学知识点总是冷冰冰的&#xff0c;枯燥、深奥也总是科学的代名词。如今教育局明确规定科学课是小学必修课&#xff0c;孩子也逐步接受科学知识的熏陶。但科学课上冷冰冰的&#xff0c;枯燥、…

技术分享|手机推送原理剖析指南

源宝导读&#xff1a;本文旨在对手机推送原理进行剖析和阐述&#xff0c;对业务开发做一些方向性的解惑。一、手机推送的基本概念 ——什么是手机推送&#xff1f;百度词条&#xff1a;手机推送服务是指服务器 定向将信息实时送达手机的服务词条中有2组概念&#xff1a;第一组是…

闽高校计算机二级c语言模拟器,闽高校计算机二级C语言模拟卷及答案.doc

闽高校计算机二级C语言模拟卷及答案.doc (54页)本资源提供全文预览&#xff0c;点击全文预览即可全文预览,如果喜欢文档就下载吧&#xff0c;查找使用更方便哦&#xff01;9.90 积分&#xfeff;一、单项选择题(每小题2分&#xff0c;共20分)1.以下4组用户定义标识符中&#xf…

重磅!中国最赚钱的公司,要上市了!

全世界只有3.14 % 的人关注了数据与算法之美12月31日&#xff0c;中国烟草子公司中烟国际&#xff08;香港&#xff09;神秘地向香港交易所递交了IPO的材料&#xff0c;赶上了2018年的末班车。嫡子上市&#xff0c;中国烟草自己向众人掀起了裙裾一角。过去三年&#xff0c;中烟…

浅谈VS2012单元测试

1、先建一个工程此工程带有待测试的方法 2、在解决方案中建立单元测试 3、在测试项目中添加测试项目的引用 4、写测试用例 namespace UnitTestProject1 {[TestClass]public class UnitTest1{[TestMethod]public void TestMethod1(){var restClient (IRestClient)new JsonServi…