日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > C# >内容正文

C#

c#操作Xml(四)

發(fā)布時(shí)間:2024/4/11 C# 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c#操作Xml(四) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

上集回顧

??? 上集初步介紹了Linq to Xml的基本操作,簡單的新建xml操作和簡單的查詢xml操作。不過,可以注意到的是上集里面的xml都是沒有Namespace的xml,那么有Namespace的xml如何操作哪?

設(shè)置目標(biāo)

??? 先看看我們目標(biāo),完整這樣一個(gè)xml:

<?xml version="1.0" encoding="utf-8" ?> <v:persons xmlns:v="http://www.cnblogs.com/vwxyzh/"><v:person><v:firstName>Zhenway</v:firstName><v:lastName>Yan</v:lastName><v:address>http://www.cnblogs.com/vwxyzh/</v:address></v:person> </v:persons>

??? 注意,這個(gè)xml的每一個(gè)節(jié)點(diǎn)都是 http://www.cnblogs.com/vwxyzh/ 這個(gè)命名空間下的。

??? 當(dāng)然,這樣的xml也有很多種等效寫法,具體請(qǐng)參考w3shools。

分析實(shí)現(xiàn)手段

??? 與之前一集相比,這里的”persons”,不再是一個(gè)純粹的”persons”,而是一個(gè)帶有Namespace的persons,所以在創(chuàng)建這樣一個(gè)節(jié)點(diǎn)時(shí)不再是之前的:

var persons = new XElement("persons");

??? 而是需要修改成帶有Namespace的節(jié)點(diǎn)名。

??? 那么如何獲得這個(gè)帶有Namespace的節(jié)點(diǎn)名哪?

??? 好吧,讓我們回過頭來看看XElement的構(gòu)造函數(shù):

public XElement(XName name);

??? 注意哦,參數(shù)的類型是XName,而不是string,那么平時(shí)為什么能用string哪?因?yàn)樯弦患锩嫣岬竭^,XName定義了一個(gè)隱式的轉(zhuǎn)換,可以把string隱式的轉(zhuǎn)換成XName。

??? 所以,關(guān)于Namespace自然也要從XNamespace入手,然后找一個(gè)能夠變成XName的方法,察看XNamespace的定義,就可以看到:

public static XName operator +(XNamespace ns, string localName);

??? 只要把XNamespace加上本地名稱(string),就是一個(gè)XName了,非常簡單。

??? 再看看如何創(chuàng)建一個(gè)XNamespace:

public static implicit operator XNamespace(string namespaceName);

??? 又是隱式轉(zhuǎn)換。。。來看看具體如何創(chuàng)建一個(gè)帶namespace的persons吧:

XNamespace v = "http://www.cnblogs.com/vwxyzh/"; var persons = new XElement(v + "persons");

??? 定義一個(gè)namespace,在使用時(shí)直接+string即可。在c#里面這已經(jīng)是最簡單的方式了。

實(shí)現(xiàn)

??? 到這里,已經(jīng)可以完成上面的那個(gè)目標(biāo)xml了:

XNamespace v = "http://www.cnblogs.com/vwxyzh/"; XDocument doc = new XDocument(new XDeclaration("1.0", "utf-8", null),new XElement(v + "persons",new XElement(v + "person",new XElement(v + "firstName", "Zhenway"),new XElement(v + "lastName", "Yan"),new XElement(v + "address", "http://www.cnblogs.com/vwxyzh/")))); doc.Save(Console.Out);

??? 來看看執(zhí)行結(jié)果:

<?xml version="1.0" encoding="gb2312"?> <persons xmlns="http://www.cnblogs.com/vwxyzh/"><person><firstName>Zhenway</firstName><lastName>Yan</lastName><address>http://www.cnblogs.com/vwxyzh/</address></person> </persons>

??? 和預(yù)期的略有不同,首先encoding被修改成gb2312,這是因?yàn)橹形牟僮飨到y(tǒng)的Console的編碼是gb2312,所以Xml的encoding被自動(dòng)修改了,其次,原來的Namespace用v來縮寫,但是輸出的xml缺是改用了默認(rèn)Namespace,不過如果看過前面提到的w3schools的話,就知道這兩者是等價(jià)xml。

擴(kuò)展

??? 在查找一個(gè)xml時(shí),同樣也是需要一個(gè)XName,因此當(dāng)遇到有Namespace的xml,也可以用同樣的手法:

XDocument doc = XDocument.Parse(@"<?xml version=""1.0"" encoding=""utf-8"" ?> <v:persons xmlns:v=""http://www.cnblogs.com/vwxyzh/""><v:person><v:firstName>Zhenway</v:firstName><v:lastName>Yan</v:lastName><v:address>http://www.cnblogs.com/vwxyzh/</v:address></v:person><v:person><v:firstName>Allen</v:firstName><v:lastName>Lee</v:lastName><v:address>http://www.cnblogs.com/allenlooplee/</v:address></v:person> </v:persons>");XNamespace v = "http://www.cnblogs.com/vwxyzh/";foreach (var item in from person in doc.Root.Descendants(v + "person")where (string)person.Element(v + "firstName") == "Zhenway"select (string)person.Element(v + "address")){Console.WriteLine(item);}

?

總結(jié)和下集預(yù)告

??? Linq to Xml的介紹基本上就告一段落,不過,無論是Dom Api還是Linq to Xml都是In-Memory的工作方式,這樣的工作方式對(duì)內(nèi)存的要求相對(duì)較高,而且不適合超大xml文件的處理。

??? 因此,下集將介紹如何不占用內(nèi)存的寫一個(gè)超大的xml,當(dāng)然其中也有Linq to Xml的一部分內(nèi)容(Linq to Xml當(dāng)初就預(yù)留了這部分)。

總結(jié)

以上是生活随笔為你收集整理的c#操作Xml(四)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。