C# 解析XML和反序列化的示例
本次為了記錄開(kāi)發(fā)一個(gè)基于webservice接口,去解析對(duì)方傳送過(guò)來(lái)的xml字符串。實(shí)際使用時(shí)遇到的一些問(wèn)題。
傳輸過(guò)來(lái)的xml格式大致如下:
<?xml version="1.0" encoding="UTF-8"?>
<messages xmlns="http://www.test.com/hit/rhin" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.test.com/hit/rhin file:///e:/request_message.xsd">
<heartbeat/>
<switchset></switchset>
<business>
<datasets>
<setdetails>
<WS02_01>內(nèi)容</WS02_01>
</setdetails>
<setdetails>
<WS02_01>內(nèi)容</WS02_01>
</setdetails>
</datasets>
</business>
</messages>
- xmlns 是默認(rèn)的命名空間,在有命名空間情況下,需要使用XmlNamespaceManager進(jìn)行處理。
- xmlns:xsi 定義了一個(gè)命名空間前綴 xsi 對(duì)應(yīng)的唯一字符串 www.w3.org/2001/XMLSch… ,而且這個(gè) xmlns:xsi 在不同的 xml 文檔中似乎都會(huì)出現(xiàn)。 這是因?yàn)?xsi 已經(jīng)成為了一個(gè)業(yè)界默認(rèn)的用于 XSD(XML Schema Definition) 文件的命名空間。 而 XSD 文件(也常常稱(chēng)為 Schema 文件)是用來(lái)定義 xml 文檔結(jié)構(gòu)的。
XML 解析器可以根據(jù) 一個(gè) XSD 文件的內(nèi)容來(lái)解析另一個(gè) XML 文件, 判斷該文件的結(jié)構(gòu) 是否和 XSD 文件中定義的一致。 XSD 文件 可以理解為 XML 文檔可以自定義的語(yǔ)法或格式檢查器。
- xsi:schemaLocation 是一個(gè)由空格分開(kāi)的鍵值對(duì),前一個(gè) 鍵 www.test.com/hit/rhin 是命名空間, 是一個(gè)全局唯一字符串。后一個(gè) 值 是XSD location URI , 這個(gè)值指示了前一個(gè)命名空間所對(duì)應(yīng)的 XSD 文件的位置, xml parser 可以利用這個(gè)信息獲取到 XSD 文件, 從而通過(guò) XSD 文件對(duì)所有屬于 命名空間 www.test.com/hit/rhin 的元素結(jié)構(gòu)進(jìn)行校驗(yàn), 因此這個(gè)值必然是可以訪(fǎng)問(wèn)的, 且訪(fǎng)問(wèn)到的內(nèi)容是一個(gè) XSD 文件的內(nèi)容
具體實(shí)現(xiàn)代碼:
//讀取xml
XmlDocument xml = new XmlDocument();
xml.LoadXml(XMLData);
//命名空間處理
XmlNamespaceManager m = new XmlNamespaceManager(xml.NameTable);
m.AddNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance");
m.AddNamespace("d", "http://www.test.com/hit/rhin"); //d是隨意的一個(gè)命名
//讀取數(shù)據(jù)節(jié)點(diǎn),需要帶上命名空間m
XmlNodeList dataNodeList = xml.SelectNodes("d:messages/d:business/d:datasets/d:setdetails", m);
if (dataNodeList != null && dataNodeList.Count > 0)
{
for (int i = 0; i < dataNodeList.Count; i++)
{
var model = XmlToEntity<TestModel>(dataNodeList[i].OuterXml,"http://www.test.com/hit/rhin");
}
}
XmlToEntity方法 將xml反序列化到Model實(shí)體上。
privated T XmlToEntity<T>(string xml, string nameSpace)
{
T obj = default(T);
try
{
XmlRootAttribute root = new XmlRootAttribute("setdetails");
root.Namespace = nameSpace;//帶命名空間的操作
XmlSerializer serializer = new XmlSerializer(typeof(T),root);
StringReader sr = new StringReader(xml);
obj = (T)serializer.Deserialize(sr);
sr.Close();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
return obj;
}
實(shí)體定義也需要說(shuō)明命名空間
[XmlRoot(Namespace = "http://www.test.com/hit/rhin", IsNullable = false, ElementName = "setdetails")]
[Table("TAB_TEST")]
public class TestModel
{
[XmlElement("WS02_01")]
public string NEIRONG { get; set; }
}
以上就是C# 解析XML和反序列化的示例的詳細(xì)內(nèi)容,更多關(guān)于C# 解析XML和反序列化的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- C#實(shí)現(xiàn)XML序列化與反序列化
- C#對(duì)Json進(jìn)行序列化和反序列化
- C#中關(guān)于序列化與反序列化的三種方法
- C# Newtonsoft.Json 解析多嵌套json 進(jìn)行反序列化的實(shí)例
- C#中Json反序列化的實(shí)現(xiàn)方法
- C#實(shí)現(xiàn)XML與實(shí)體類(lèi)之間相互轉(zhuǎn)換的方法(序列化與反序列化)
- C#序列化與反序列化(Serialize,Deserialize)實(shí)例詳解
- c#對(duì)象反序列化與對(duì)象序列化示例詳解
- C#實(shí)現(xiàn)json的序列化和反序列化實(shí)例代碼
- 深入理解C#序列化與反序列化的詳解
- C# SimpleJSON字典反序列化實(shí)戰(zhàn)教程
相關(guān)文章
WPF實(shí)現(xiàn)動(dòng)畫(huà)效果(六)之路徑動(dòng)畫(huà)
這篇文章介紹了WPF實(shí)現(xiàn)動(dòng)畫(huà)效果之路徑動(dòng)畫(huà),文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-06-06
一起來(lái)學(xué)習(xí)C#的觀(guān)察者模式
這篇文章主要為大家詳細(xì)介紹了C#的觀(guān)察者模式,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-03-03
C#實(shí)現(xiàn)Post數(shù)據(jù)或文件到指定的服務(wù)器進(jìn)行接收
這篇文章主要為大家詳細(xì)介紹了如何通過(guò)C#實(shí)現(xiàn)Post數(shù)據(jù)或文件到指定的服務(wù)器進(jìn)行接收,文中的示例代碼講解詳細(xì),需要的小伙伴可以參考下2024-03-03
C#實(shí)現(xiàn)遠(yuǎn)程關(guān)閉計(jì)算機(jī)或重啟計(jì)算機(jī)的方法
這篇文章主要介紹了C#實(shí)現(xiàn)遠(yuǎn)程關(guān)閉計(jì)算機(jī)或重啟計(jì)算機(jī)的方法,涉及C#遠(yuǎn)程連接及系統(tǒng)命令的調(diào)用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-08-08
C#實(shí)現(xiàn)把指定數(shù)據(jù)寫(xiě)入串口
這篇文章主要介紹了C#實(shí)現(xiàn)把指定數(shù)據(jù)寫(xiě)入串口,直接給出示例代碼,需要的朋友可以參考下2015-06-06
C#實(shí)現(xiàn)提高xml讀寫(xiě)速度的方法
這篇文章主要介紹了C#實(shí)現(xiàn)提高xml讀寫(xiě)速度的方法,并且針對(duì)各類(lèi)文件的讀寫(xiě)做了較為細(xì)致的分析,非常實(shí)用,需要的朋友可以參考下2014-11-11

