上一节介绍了XML的结构以及如何创建。讲到了XML可作为一种简单文本存储数据,把数据存储起来,以XML的方式进行传递。当接收到XML时,必不可少的就是对其进行解析,捞取有效数据,或者将第三方数据以节点的形式填充至此XML。无论如何,都离不开对XML的解析,XML有一般的,同样也有二般的,这一节就来介绍如何对这些XML进行解析。

1. 普通XML

<?xml version="1.0" encoding="utf-8"?>
<Sudent>
<StudentID>0000</StatusCode>
<StudentName>張三</StatusDesc>
</Sudent>
<StudentTec>魏老師</StudentTec>

对于一般的XML,只需要读取加载,然后遍历就可以获取某个标签对的值,遍历的方法有很多

  #region 遍历基本的XML
XElement root = XElement.Load(@"D:\test.xml");
//根據Elements 遍歷
foreach (XElement item in root.Elements("StudentID"))
{
Console.WriteLine(item);
}
//根據Lambda 遍歷
var query = root.Elements().Select(u => u);
foreach (var q in query)
{
Console.WriteLine(q);
}
//根據Nodes 遍歷
foreach (var item in root.Nodes())
{
if (item.NextNode.ToString() == "StudentName")
{
Console.WriteLine(item.Document);
}
Console.WriteLine(item);
}
#endregion

2.  实际在项目中,往往需要操作较为复杂的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></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></x4:StatusCode>
</x4:Status>
</x3:SecondInform>
</x2:Body>
</x0:Envelope>

所谓soap格式,就是含有Envelope、Header、Body的标签对,如上,一般body和header之间还存在子命名空间,不管怎么写的繁琐,思路和2中一样,读取其中某个标签对中的值,带上其对应的命名空间即可。

或者如这中层级结构明显的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></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></x4:StatusCode>
</x2:Status>
</x2:SecondInform>
</x1:Body>
</x0:Envelope>

不管是A还是B,对于常规的解析方案,即DOM 解析,获取指定标签值: 命名空间+标签对

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"); //对A中元素取值
string laa = xml.SelectSingleNode("x0:Envelope/x2:Body/x3:SecondInform/x4:Status/x4:StatusCode", xmlnsm).InnerText;
//对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;
}

上面是常規的解析XML的方法,如果我们要获取XML中所有标签的属性值,就需要加载XML中所有的标签对,也就是说,我们需要写N个类似于

"x0:Envelope/x2:Body/x2:IBBC/x2:SecondInform/x2:Status/x2:StatusCode" 的指定属性值所有的前缀层级。有没有其他解决方法呢?其实还有一种方法,用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"; //对A中元素取值
string laa = xml.Descendants(x4+"StatusCode").FirstOrDefault().Value.ToString();
//对B中元素取值
string lab = xml.Descendants(x2+"StatusCode").FirstOrDefault().Value.ToString(); return lab;
}

可以得知,当用Linq解析XML的时候,用的同样是 命名空间+指定标签 的思想,但是不需要指定目的标签层级之前的所有前缀,相对来说简洁不少,其实Linq的功能是非常强大的,个人推荐,当需要其数个标签对的属性值时,一般的处理方式是,写一个Dictionnay<string,string>, 采取键值对的方式将XML的属性名和属性值进行存储,当需要某个值时,只需要New一个对象带入键名,便可得到其对应的属性值。

XML系列之--创建电文格式的XML(一)

XML系列之--解析电文格式的XML(二)

XML系列之--对电文格式XML的简单操作(三)

XML系列之--Linq操作带属性的XML(四)

XML系列之--解析电文格式的XML(二)的更多相关文章

  1. XML系列之--创建电文格式的XML(一)

    关于XML,学校那会,老师在口中仅仅提及,自己也未曾深入接触过,仅是些将最基本XML文件内容显示在web定义的表格中之类的简单操作,如今项目中的收发电文涉及到复杂XML的操作.趁此契机好好回顾下XML ...

  2. XML系列之--对电文格式XML的简单操作(三)

    前两章介绍了关于Linq创建.解析SOAP格式的XML,在实际运用中,可能会对xml进行一些其它的操作,比如基础的增删该查,而操作对象首先需要获取对象,针对于DOM操作来说,Linq确实方便了不少,如 ...

  3. WebService如何封装XML请求 以及解析接口返回的XML

    原 WebService如何封装XML请求 以及解析接口返回的XML 置顶 2019年08月16日 15:00:47 童子泛舟 阅读数 28 标签: XML解析WebService第三方API 更多 ...

  4. 解析特殊格式的xml到map

    由于项目特殊,需要解析的xml文档样式特别,所以自己写了一个解析特殊xml的方法 先提供xml样式 <?xml version="1.0" encoding="UT ...

  5. Linq解析带命名空间、前缀、Soap格式的XML

    关于XML,经常会用到,XML有一般的,同样也有二般的,更不要觉得会操作基础的XML就觉得自己已经精通XML操作,文中是对解析XML的方法进行介绍 1. 一般XML <?xml version= ...

  6. Linq创建带命名空间、前缀、Soap格式的XML

    关于XML,我也是刚接触,关于一般常见的XML,博客园.CSDN上的资料很多,对于不常见的带命名空间.前缀.Soap格式的XML的描述相对来说寥寥无几,上一篇我写到了对相对复杂的XML的读操作,下面说 ...

  7. XML系列之--Linq操作带属性的XML(四)

    关于XML,之前解析过电文收发方面的,就是所谓的带表头.前缀(命名空间)SOAP格式.这次需求是解析一个xml的模板(xls内容),然后填充数据,最后保存.需要时可转换xls.pdf等文件.关于这种带 ...

  8. Silverlight项目笔记7:xml/json数据解析、TreeView、引用类型与数据绑定错误、图片加载、虚拟目录设置、silverlight安全机制引发的问题、WebClient缓存问题

    1.xml/json数据解析 (1)xml数据解析 使用WebClient获取数据,获取到的数据实例化为一个XDocument,使用XDocument的Descendants(XName)方法获得对应 ...

  9. Python开发包推荐系列之xml、html解析器PyQuery

    使用python,喜欢她的简洁是一方面,另外就是它有着丰富的开发包 好用又方便 接下来会给大家推荐一系列很赞的开发包. 在解析html.xml过程中,我们有不少的包可以用.比如bs.lxml.xmlt ...

随机推荐

  1. git 码云的常用命令(版本控制)

    首先在码云仓库创建对应的仓库 当你输入错误用户名和密码 需要清掉配置 git config --system --unset credential.helper 设置账号 git config --g ...

  2. MySQL+InnoDB semi-consitent read原理及实现分析(转)

    add by zhj: 主要讲的是在MySQL在Repeatable Read和Read Committed级别下,加锁时的不同,在Read Committed隔离级别下,只对where 中满足条件的 ...

  3. SQL查询优化:详解SQL Server非聚集索引(转载)

    本文是转载,原文地址 http://tech.it168.com/a2011/1228/1295/000001295176.shtml 在SQL SERVER中,非聚集索引其实可以看作是一个含有聚集索 ...

  4. 使用jquery.uploadify上传文件

    今天在网上找了一天,想要找到一个比较全的使用案例,结果发现基本上全是一个版本的... 我的问题主要是上传完成后,还需要将路径获取到,然后保存到数据库. 查了一下资料发现有这么一个参数onComplet ...

  5. .NET Core 使用 Kestrel

    Kestrel介绍 Kestrel是一个基于libuv的跨平台web服务器 在.net core项目中就可以不一定要发布在iis下面了 Kestrel体验 可以使用useUrls来设置一个请求的地址 ...

  6. MySQL 5.6 Index Condition Pushdown

    ICP(index condition pushdown)是mysql利用索引(二级索引)元组和筛字段在索引中的where条件从表中提取数据记录的一种优化操作.ICP的思想是:存储引擎在访问索引的时候 ...

  7. 006-网页嵌入数据Data URI scheme

    在项目css中或者图片展示中: url(data:image/png;base64,iVBORw0KGgoAAA 在RFC2397中定义的Data URI scheme,目的是将一些小的数据,直接嵌入 ...

  8. 2017-2018-2 20165236 实验四《Android开发基础》实验报告

    2017-2018-2 20165236 实验四<Android开发基础>实验报告 一.实验报告封面 课程:Java程序设计       班级:1652班       姓名:郭金涛     ...

  9. [LeetCode] 106. Construct Binary Tree from Postorder and Inorder Traversal_Medium tag: Tree Traversal

    Given inorder and postorder traversal of a tree, construct the binary tree. Note:You may assume that ...

  10. tcp_nopush高性能

    nginx sendfile tcp_nopush tcp_nodelay参数解释