四时宝库

程序员的知识宝库

.Net平台下使用C#操作XML浅析—Xpath读取,XML、Json、Model互转

很久没更新了,一方面因为文采不行,另一方面内容质量有限。但是仔细考虑了一下,为了方便自己以后查阅,同时为入门级别的网友提供一些参考,决定从今天起每周分享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。


发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接