很久没更新了,一方面因为文采不行,另一方面内容质量有限。但是仔细考虑了一下,为了方便自己以后查阅,同时为入门级别的网友提供一些参考,决定从今天起每周分享2-3篇文章,内容涉及.Net、.Net Core等,但愿自己能够坚持。如果大家有关.Net方向的技术需要讨论,也可以留言或者私信。
正题:如何使用C#操作XML
一.XPath简介
XPath 使用路径表达式来选取 XML 文档中的节点或节点集。节点是通过沿着路径 (path) 或者步 (steps) 来选取的。
常用XPath表达式
表达式 描述
nodename 选取此节点的所有子节点。
/ 从根节点选取。
// 从当前节点选择文档中的节点,而不考虑其位置。
. 选取当前节点。
.. 选取当前节点的父节点。
@ 选取属性。
示例
XML文档如下:
<?xml version="1.0" encoding="ISO-8859-1"?> <bookstore> <book> <title lang="eng">Harry Potter</title> <price>29.99</price> </book> <book> <title lang="eng">Learning XML</title> <price>39.95</price> </book> </bookstore>
路径 表达式结果
bookstore 选取 bookstore 元素的所有子节点。
/bookstore 选取根元素 bookstore。
bookstore/book 选取属于 bookstore 的子元素的所有 book 元素。
//book 选取所有 book 子元素,而不管其在文档中的位置。
bookstore//book 选择属于 bookstore 元素的后代的所有 book 元素,而不管它们位于 bookstore 之下的什么位置。
//@lang 选取名为 lang 的所有属性。
注释:假如路径起始于正斜杠( / ),则此路径始终代表到某元素的绝对路径!
注:这里简单介绍一些Xpath的知识,便于理解代码部分,更多Xpath详细信息请自行百度。
理解Xpath可以类比目录结构,/表示根目录,./当前目录,../上一级目录
二:C#解析XML
XML文档分为有命名空间和无命名空间两类,针对有命名空间的文档,在解析时必须指定命名空间,否则会提示如下异常:
以SOAP文档为例。
<v:Envelope xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:d="http://www.w3.org/2001/XMLSchema" xmlns:c="http://schemas.xmlsoap.org/soap/encoding/" xmlns:v="http://schemas.xmlsoap.org/soap/envelope/"> <v:Header> <n0:MySoapHeader xmlns:n0="http://test.net/"> <n0:UserName i:type="d:string">test</n0:UserName> <n0:password>123456</n0:password> </n0:MySoapHeader> </v:Header> <v:Body> <GetCK xmlns="http://test.net/" id="o0" c:root="1"> <SerId i:type="d:string">5</SerId> <LoginFlag i:type="d:int">1</LoginFlag> </GetCK> </v:Body> </v:Envelope>
C#解析代码:
注:针对节点SerId,LoginFlag,因为其包含在含有名称空间的节点GetCK下,因此在定义Xpath表达式时需要特别注意在节点前增加名称空间限定符。如:"/v:Header/n0:MySoapHeader/n0:UserName",否则会出现返回节点为null的问题。
string path = AppDomain.CurrentDomain.BaseDirectory + "1.xml"; XmlDocument doc = new XmlDocument(); doc.Load(path); var rootElement = doc.DocumentElement; XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable); nsmgr.AddNamespace("i", "http://www.w3.org/2001/XMLSchema-instance"); nsmgr.AddNamespace("d", "http://www.w3.org/2001/XMLSchema"); nsmgr.AddNamespace("c", "http://schemas.xmlsoap.org/soap/encoding/"); nsmgr.AddNamespace("v", "http://schemas.xmlsoap.org/soap/envelope/"); nsmgr.AddNamespace("n0", "http://test.net/"); var node = rootElement.SelectSingleNode("./v:Header/n0:MySoapHeader/n0:UserName", nsmgr); var node1 = rootElement.SelectSingleNode("./v:Body/n0:GetCK/n0:SerId", nsmgr); var serId = rootElement.SelectSingleNode("./v:Body",nsmgr).ChildNodes[0].SelectSingleNode("./n0:LoginFlag",nsmgr);
三:XML、JSON、Model互转
这里简单介绍一下使用Json.Net类库(Newtonsoft.Json)来实现XML,Json,Model互转。
var user = new { UserName ="Test", Age = "20" }; //object 转 json string json = JsonConvert.SerializeObject(user); //json 转xml string xml = JsonConvert.DeserializeXNode(json, "Root", true).ToString(); //xml 转json XmlDocument doc = new XmlDocument(); doc.LoadXml(xml); string jsontext = JsonConvert.SerializeXmlNode(doc); //json转object User anotnerUser = JsonConvert.DeserializeObject<User >(jsontext);
以上便是今天给大家分享的内容,只是起一个引导作用。熟悉的人感觉会很简单。望大家多多指点!最后推荐一个类库HtmlAgilityPack,用于像Xpath那样解析HTML。