XML系列之--解析电文格式的XML(二)
? ? ? 上一節(jié)介紹了XML的結(jié)構(gòu)以及如何創(chuàng)建。講到了XML可作為一種簡(jiǎn)單文本存儲(chǔ)數(shù)據(jù),把數(shù)據(jù)存儲(chǔ)起來(lái),以XML的方式進(jìn)行傳遞。當(dāng)接收到XML時(shí),必不可少的就是對(duì)其進(jìn)行解析,撈取有效數(shù)據(jù),或者將第三方數(shù)據(jù)以節(jié)點(diǎn)的形式填充至此XML。無(wú)論如何,都離不開(kāi)對(duì)XML的解析,XML有一般的,同樣也有二般的,這一節(jié)就來(lái)介紹如何對(duì)這些XML進(jìn)行解析。
1. 普通XML
<?xml version="1.0" encoding="utf-8"?><Sudent><StudentID>0000</StatusCode><StudentName>張三</StatusDesc></Sudent><StudentTec>魏老師</StudentTec>對(duì)于一般的XML,只需要讀取加載,然后遍歷就可以獲取某個(gè)標(biāo)簽對(duì)的值,遍歷的方法有很多
#region 遍歷基本的XMLXElement root = XElement.Load(@"D:\test.xml"); //根據(jù)Elements 遍歷foreach (XElement item in root.Elements("StudentID")){Console.WriteLine(item);}//根據(jù)Lambda 遍歷var query = root.Elements().Select(u => u);foreach (var q in query){Console.WriteLine(q);}//根據(jù)Nodes 遍歷foreach (var item in root.Nodes()){if (item.NextNode.ToString() == "StudentName"){Console.WriteLine(item.Document);}Console.WriteLine(item);} #endregion?
2. ?實(shí)際在項(xiàng)目中,往往需要操作較為復(fù)雜的XML。像帶命名空間的且為 soap格式的XML,如A
<?xml version="1.0" encoding="UTF-8"?> <ns0:Envelope xmlns:x0="http://www.w3school.com.cn/Envelope" xmlns:x1="http://www.w3school.com.cn/Header" ><x1:Header><x1:Type>ICC</x1:dType><x1:Version>01</x1:Version></x1:Header><x2:Body xmlns:x2="http://www.w3school.com.cn/Body" xmlns:x3="http://www.w3school.com.cn/IBBC/01" xmlns:x4="http://www.w3school.com.cn/ICCB/01"><x3:SecondInform><x4:Status><x4:StatusCode>0000</x4:StatusCode></x4:Status> </x3:SecondInform></x2:Body> </x0:Envelope>所謂soap格式,就是含有Envelope、Header、Body的標(biāo)簽對(duì),如上,一般body和header之間還存在子命名空間,不管怎么寫的繁瑣,思路和2中一樣,讀取其中某個(gè)標(biāo)簽對(duì)中的值,帶上其對(duì)應(yīng)的命名空間即可。
或者如這中層級(jí)結(jié)構(gòu)明顯的XML,如B
<?xml version="1.0" encoding="utf-8"?> <x0:Envelope xmlns:x0="http://www.w3school.com.cn/Envelope"><x1:Header xmlns:x1="http://www.w3school.com.cn/Header"><x1:Type>ICC</x1:dType><x1:Version>01</x1:Version></x1:Header><x1:Body xmlns:x1="http://www.w3school.com.cn/Body"><x2:IBBC xmlns:x2="http://ns.chinatrust.com.tw/XSD/CTCB/BC/Message/IBBC/01"><x2:SecondInform><x2:Status><x2:StatusCode>0000</x4:StatusCode></x2:Status> </x2:SecondInform></x1:Body> </x0:Envelope>不管是A還是B,對(duì)于常規(guī)的解析方案,即DOM 解析,獲取指定標(biāo)簽值: 命名空間+標(biāo)簽對(duì)
public string ReadXMl(string xmlurl) { XmlDocument xml = new XmlDocument();xml.Load(xmlurl); var xmlnsm = new XmlNamespaceManager(xml.NameTable);xmlnsm.AddNamespace("x0", @"http://www.w3school.com.cn/Envelope");xmlnsm.AddNamespace("x2", @"http://www.w3school.com.cn/Body");xmlnsm.AddNamespace("x3", @"http://www.w3school.com.cn/IBBC/01");xmlnsm.AddNamespace("x4", @"http://www.w3school.com.cn/ICCB/01"); //對(duì)A中元素取值string laa = xml.SelectSingleNode("x0:Envelope/x2:Body/x3:SecondInform/x4:Status/x4:StatusCode", xmlnsm).InnerText; //對(duì)B中元素取值string lab = xml.SelectSingleNode("x0:Envelope/x2:Body/x2:IBBC/x2:SecondInform/x2:Status/x2:StatusCode", xmlnsm).InnerText;//修改XML中的值 //xelement.SetAttributeValue(namespacehaif + Labelname, "50000"); // xml.Save(xmlurl); return lab; }上面是常規(guī)的解析XML的方法,如果我們要獲取XML中所有標(biāo)簽的屬性值,就需要加載XML中所有的標(biāo)簽對(duì),也就是說(shuō),我們需要寫N個(gè)類似于
"x0:Envelope/x2:Body/x2:IBBC/x2:SecondInform/x2:Status/x2:StatusCode" 的指定屬性值所有的前綴層級(jí)。有沒(méi)有其他解決方法呢?其實(shí)還有一種方法,用Linq的思想。
如下,選擇Linq to xml?
public string ReadXMl(string xmlurl) { XElement xml = XElement.Load(xmlpath); XNamespace x0 = @"http://www.w3school.com.cn/Envelope"; XNamespace x2 = @"http://www.w3school.com.cn/Body";XNamespace x3 = @"http://www.w3school.com.cn/IBBC/01";XNamespace x4 = @"http://www.w3school.com.cn/ICCB/01";//對(duì)A中元素取值string laa = xml.Descendants(x4+"StatusCode").FirstOrDefault().Value.ToString(); //對(duì)B中元素取值string lab = xml.Descendants(x2+"StatusCode").FirstOrDefault().Value.ToString(); return lab; }可以得知,當(dāng)用Linq解析XML的時(shí)候,用的同樣是 命名空間+指定標(biāo)簽 的思想,但是不需要指定目的標(biāo)簽層級(jí)之前的所有前綴,相對(duì)來(lái)說(shuō)簡(jiǎn)潔不少,其實(shí)Linq的功能是非常強(qiáng)大的,個(gè)人推薦,當(dāng)需要其數(shù)個(gè)標(biāo)簽對(duì)的屬性值時(shí),一般的處理方式是,寫一個(gè)Dictionnay<string,string>, 采取鍵值對(duì)的方式將XML的屬性名和屬性值進(jìn)行存儲(chǔ),當(dāng)需要某個(gè)值時(shí),只需要New一個(gè)對(duì)象帶入鍵名,便可得到其對(duì)應(yīng)的屬性值。
?
XML系列之--創(chuàng)建電文格式的XML(一)
XML系列之--解析電文格式的XML(二)
XML系列之--對(duì)電文格式XML的簡(jiǎn)單操作(三)
XML系列之--Linq操作帶屬性的XML(四)
轉(zhuǎn)載于:https://www.cnblogs.com/Sientuo/p/6022939.html
總結(jié)
以上是生活随笔為你收集整理的XML系列之--解析电文格式的XML(二)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 浅玩JavaScript的数据类型判断
- 下一篇: 设计模式——门面(外观)模式