c#操作Xml(四)
上集回顧
??? 上集初步介紹了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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【转载】2010年最全最新令人无语语录
- 下一篇: c# char unsigned_dll