您好,登錄后才能下訂單哦!
怎么在C#中解析XML?針對這個問題,這篇文章詳細(xì)介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
<?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進行處理。
xmlns:xsi 定義了一個命名空間前綴 xsi 對應(yīng)的唯一字符串 www.w3.org/2001/XMLSch… ,而且這個 xmlns:xsi 在不同的 xml 文檔中似乎都會出現(xiàn)。 這是因為 xsi 已經(jīng)成為了一個業(yè)界默認(rèn)的用于 XSD(XML Schema Definition) 文件的命名空間。 而 XSD 文件(也常常稱為 Schema 文件)是用來定義 xml 文檔結(jié)構(gòu)的。
XML 解析器可以根據(jù) 一個 XSD 文件的內(nèi)容來解析另一個 XML 文件, 判斷該文件的結(jié)構(gòu) 是否和 XSD 文件中定義的一致。 XSD 文件 可以理解為 XML 文檔可以自定義的語法或格式檢查器。
xsi:schemaLocation 是一個由空格分開的鍵值對,前一個 鍵 www.test.com/hit/rhin 是命名空間, 是一個全局唯一字符串。后一個 值 是XSD location URI , 這個值指示了前一個命名空間所對應(yīng)的 XSD 文件的位置, xml parser 可以利用這個信息獲取到 XSD 文件, 從而通過 XSD 文件對所有屬于 命名空間 www.test.com/hit/rhin 的元素結(jié)構(gòu)進行校驗, 因此這個值必然是可以訪問的, 且訪問到的內(nèi)容是一個 XSD 文件的內(nèi)容
具體實現(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是隨意的一個命名 //讀取數(shù)據(jù)節(jié)點,需要帶上命名空間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實體上。
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; }
實體定義也需要說明命名空間
[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; } }
關(guān)于怎么在C#中解析XML問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。