上一节介绍了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 遍历基本的XMLXElement 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>01</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>0000</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>01</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>0000</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(四)

转载于:https://www.cnblogs.com/Sientuo/p/6022939.html

XML系列之--解析电文格式的XML(二)相关推荐

  1. java xml类型_java 解析String类型的xml

    网络中有时候我们的参数是以xml类型传递的,有时会把xml拼成一个String字符串. 解析如下: 单一xml文档解析 xml文件 encoding="gb2312"?> z ...

  2. 掌握XML系列(四)---创建格式良好的XML文档

    掌握XML系列(四)---创建格式良好的XML文档 前言:创建良好格式的XML文档,虽然写了这些,其实,等到大家真正的看完之后美酒会发现,其实也很简单的,我们这里所做的是带着大家全面的看看怎么样创建. ...

  3. JavaSE——XML与JSON(语法格式、解析内容)

    第6节 XML与JSON 一.XML 1.1 XML简介 XML全称为可扩展标记语言(extensible Markup Language) . 特性: xml具有平台无关性,是一门独立的标记语言: ...

  4. Android——网络交互,如何调用接口并且json解析json格式和pull解析xml格式

    本菜鸟因为之前一直使用的是公司前辈封装好的类(网络接口调用超级方便有木有)完全没有想过有一天我会自己写,然后今天接触的时候一脸懵逼,然后今天花了一天时间终于研究好了:哈哈哈哈哈 二话不说先上代码: p ...

  5. 跟着小马哥学系列之 Spring AOP(基于 XML 定义 Advice 源码解析)

    学好路更宽,钱多少加班. --小马哥 简介 大家好,我是小马哥成千上万粉丝中的一员!2019年8月有幸在叩丁狼教育举办的猿圈活动中知道有这么一位大咖,从此结下了不解之缘!此系列在多次学习极客时间< ...

  6. Android使用SAX实现XML解析,使用text/xml格式与后台交互

    这篇博文正式发表于2015-02-16 14:20,现在显示的创建时间2015-02-05 10:07是当初写草稿的时间 一.SAX解析XML 1,首先展示一下要写入以及解析的xml的文件格式: &l ...

  7. Python数据处理(一):处理 JSON、XML、CSV 三种格式数据

    Python 数据处理系列博客来啦! 本系列将以<Python数据处理>这本书为基础,以书中每章一篇博客的形式带大家一起学习 Python 数据处理.书中有些地方讲的不太详细,我会查阅其他 ...

  8. Android中measure过程、WRAP_CONTENT详解以及 xml布局文件解析流程浅析

    转自:http://www.uml.org.cn/mobiledev/201211221.asp 今天,我着重讲解下如下三个内容: measure过程 WRAP_CONTENT.MATCH_PAREN ...

  9. XML和JSON 数据交换格式

    为什么80%的码农都做不了架构师?>>>    一.什么是数据交换格式? 客户端与服务器常用数据交换格式xml.json.html 二.数据交换格式应用场景 移动端(安卓.IOS)通 ...

最新文章

  1. 合工大的计算机专业好不好,合肥工业大学计算机好,还是西电的好?差距有多大?...
  2. 【Python学习系列十九】基于scikit-learn库进行特征选择
  3. ThinkPHP CURD返回结果参考
  4. CSS 设计指南(第3版) 初读笔记
  5. 乌班图linux怎么连手机热点,使用Ubuntu12.04创建无线WiFi热点供手机上网
  6. 看完师兄的代码笔记,我失眠了
  7. Spring 访问数据库
  8. java 类加载的过程
  9. python路径中有中文_python3 网址路径中带中文的处理办法
  10. 区块链教程Fabric1.0源代码分析configtx#genesis-兄弟连
  11. 常用的自动化运维工具
  12. redhat7linux防火墙开放端口,Redhat7 firewall(防火墙)
  13. 姓名常用汉字代码查询器
  14. HIMSS 对EHR的定义
  15. 怎么把sql文件导入MySQL数据库中_《sql基础教程》书里的sql文件如何导入数据库?...
  16. P4556 [Vani有约会] 树上差分 + 线段树合并
  17. php ligerui 导出excel,LigerUI表格树的使用
  18. 小白算法学习 凸包 graham
  19. android 批量安装apk,如何一键批量安装APP应用apk安装包?
  20. 修改人人商城服务器时间,修改收货地址 · 人人商城二次开发常用文档,超详细,微擎开发微擎二次开发【持续更新】 · 看云...

热门文章

  1. 今天介绍一款强大的服务器开发工具(JRebel)
  2. SVN工具的使用 和在Eclipse中安装GPD插件:(多步审批流,因此选择使用工作流(JBPM)来实现)...
  3. 系统架构师-基础到企业应用架构-企业应用架构
  4. 学习OCS客户端定制
  5. 终端下中文乱码解决方法
  6. 当微营销撞上微商意味着什么?
  7. Spring的静态代理和动态代理
  8. Entity Framework 无法对没有主键的视图映射实体的解决办法
  9. 关于wpf窗体中Allowtransparent和WindowsFormsHost的纠纷
  10. dhcp 中继代理配置方法