都 2021 年了,竟然有人搞大数据时忽略 JSON 而去研究用 C# 把 XML 转换为 XML 的技术...
在大數(shù)據(jù)項(xiàng)目開發(fā)過程中,ETL(Extract-Transform-Load)是必不可少。即便目前 JSON 非常流行,開發(fā)人員也有必定會(huì)有對(duì)遠(yuǎn)古系統(tǒng)的挑戰(zhàn),而 XML 格式的數(shù)據(jù)源作為經(jīng)典存在渾身上下散發(fā)著濃濃 old money 的味道。
因?yàn)橛?Newtonsoft.Json 這樣優(yōu)秀的 JSON 框架存在,開發(fā)人員可以很容易的對(duì) JSON 格式的字符串反序列化。但是 XML 格式的數(shù)據(jù)就沒有這么方便了:雖然 .NET 中內(nèi)置了對(duì) XML 序列化和反序列化的支持,但遇到需要對(duì)接外部數(shù)據(jù)時(shí)就不是很方便了。
使用 XmlReader 讀取數(shù)據(jù)
從 XML 中提取目標(biāo)數(shù)據(jù)最高效,也最麻煩的方式是直接使用 XmlReader :
<employee xmlns="urn:empl-hire"><ID>12365</ID><hire-date>2003-01-08</hire-date><title>Accountant</title> </employee>使用以下代碼對(duì)上述 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 讀取數(shù)據(jù)
在 .NET Framework 3.5 發(fā)布后的時(shí)間里,開發(fā)人員可以使用 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 并不方便調(diào)試,而且需要時(shí)刻關(guān)注空引用的問題。在 XML 格式復(fù)雜、項(xiàng)目工程比較大時(shí)使用起來也不方便。
一種把 XML 轉(zhuǎn)換為 XML 的技術(shù):XSLT
在計(jì)算機(jī)科學(xué)中,可擴(kuò)展樣式表轉(zhuǎn)換語言(英語:Extensible Stylesheet Language Transformations,縮寫XSLT)是一種樣式轉(zhuǎn)換標(biāo)記語言,可以將XML數(shù)據(jù)檔轉(zhuǎn)換為另外的XML或其它格式,如HTML網(wǎng)頁,純文字。XSLT最末的T字母表示英語中的“轉(zhuǎn)換”(transformation)。
簡(jiǎn)單來說,開發(fā)人員可以借助 XSLT 技術(shù)編寫一個(gè) XML 文件,并使用該文件將一種 XML 格式轉(zhuǎn)換為另一種 XML 。即:在對(duì)接復(fù)雜格式 XML 數(shù)據(jù)源時(shí),開發(fā)人員可以編寫一個(gè)后綴為 .xsl 的文件,并使用該文件將數(shù)據(jù)源格式轉(zhuǎn)換為自己需要的格式(比如可以適配 XML 反序列化的格式)。
從一個(gè)簡(jiǎn)單的 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>如果直接在瀏覽器打開這個(gè)文件:
假設(shè)我們只關(guān)心所有的 title 信息,可以使用下面的 cdcatalog.xsl 文件,該文件可以將 cdcatalog.xml 轉(zhuǎn)為 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>為了可以在瀏覽器中直接觀察到轉(zhuǎn)換效果,可以選擇把 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>刷新瀏覽器,打開開發(fā)者工具:
也可以在:https://www.coderbusy.com/demos/2021/1531/cdcatalog.xml 查看在線示例。
從上面的操作可以看出,調(diào)試 XLS 文件的成本是很低的,開發(fā)者可以很容易對(duì) XLS 文件進(jìn)行更改,并在短時(shí)間之內(nèi)得到運(yùn)行結(jié)果。
在 C# 中使用 XSLT 技術(shù)
在 C# 中,可以使用 XslCompiledTransform 進(jìn)行 XSL 轉(zhuǎn)換。以下代碼展示這個(gè)轉(zhuǎn)換過程:
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);以上代碼會(huì)產(chǎn)生如下輸出:
<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 字符串
轉(zhuǎn)換 XML 不是目的,能直接拿到數(shù)據(jù)對(duì)象才是。以上的代碼完成了格式轉(zhuǎn)換,接著需要對(duì)轉(zhuǎn)換好的 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 實(shí)現(xiàn)了反序列化功能,這會(huì)產(chǎn)生以下輸出:
Empire Burlesque Hide your heart Greatest Hits Still got the blues Eros ...總結(jié)與源碼
本文所述的轉(zhuǎn)換和反序列化技術(shù)已經(jīng)在真實(shí)的生產(chǎn)環(huán)境中得到驗(yàn)證,千萬級(jí)的數(shù)據(jù)處理也毫不費(fèi)力。
本文包含的演示的代碼和數(shù)據(jù)可以在 Gitee 上找到:https://gitee.com/coderbusy/demo/tree/master/hello-xslt/HelloXslt 。
總結(jié)
以上是生活随笔為你收集整理的都 2021 年了,竟然有人搞大数据时忽略 JSON 而去研究用 C# 把 XML 转换为 XML 的技术...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: Magicodes.IE之总体教程
- 下一篇: 微软放弃IE浏览器 应尽快完成国产化替代
