上一节介绍了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. pyhton读取 excel表格文件

    2019的第一天,忘记昨日之事,迎接新的明天. excel表格文件办公中常用,如通过Python操作这些数据需导入并有序读取这些数据 特随笔,供以后查阅 代码如下: import xlrd # fil ...

  2. ps命令参数

    1.查看父进程ps -ef |grep <进程名>在显示的输出中,第三列就是该进程的父进程PID,然后可以再使用ps命令来查看父进程的名称ps -ef |grep <父进程PID&g ...

  3. 在Linux下用C语言实现短信收发

     本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/lyserver/archive/2008/10/01/3007090.aspx 首先,我根据功能需要创建了几个头文件 ...

  4. 获取连接的用户ip

    public static string GetUserIP() { string result = String.Empty; result = HttpContext.Current.Reques ...

  5. 代码控如何实现配置fiddler

    很多小哥哥总觉得测试点点点很low,总想码代码.那么fiddler除了一些手动设置外,还可以进行丰富的代码编写,用以完成任务. 打开fiddler,工具栏选择Rules->Customize R ...

  6. Python3学习之路~6.6 类的继承

    Inheritance 继承 面向对象编程 (OOP) 语言的一个主要功能就是“继承”.继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展.通过继承创 ...

  7. python的__all__

    用来暴露接口 控制 from xxx import * 的行为 代码中当然是不提倡用 from xxx import * 的写法的,但是在 console 调试的时候图个方便还是很常见的.如果一个模块 ...

  8. python的运行机制

    不需要生成二进制代码,python解释器把源码->字节码,然后在执行这些字节码. 解释器的具体工作: 1.完成模块(module)的加载和链接 2.将源代码编译成pyCodeObject(字节码 ...

  9. Java 基础 接口和多态

    接口 接口的概念 接口是功能的集合,同样可看做是一种数据类型,是比抽象类更为抽象的”类”. 接口只描述所应该具备的方法,并没有具体实现,具体的实现由接口的实现类(相当于接口的子类)来完成.这样将功能的 ...

  10. 模块讲解----pickle模块(只在python用的序列化与反序列化)

    特点 1.只能在python中使用,只支持python的基本数据类型. 2.可以处理复杂的序列化语法.(例如自定义的类的方法,游戏的存档等) 3.序列化的时候,只是序列化了整个序列对象,而不是内存地址 ...