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

时间:2022-01-13 13:51:27

上一节介绍了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(四)

Linq解析带命名空间、前缀、Soap格式的XML的更多相关文章

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

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

  2. dom4j解析带命名空间的xml文件

    文件内容如下 <ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd=& ...

  3. linq检索带命名空间的xml

    XElement el = XElement.Load(fil); XNamespace ns = "http://schemas.microsoft.com/ado/2009/11/edm ...

  4. XML系列之--Linq操作带属性的XML&lpar;四&rpar;

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

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

    上一节介绍了XML的结构以及如何创建.讲到了XML可作为一种简单文本存储数据,把数据存储起来,以XML的方式进行传递.当接收到XML时,必不可少的就是对其进行解析,捞取有效数据,或者将第三方数据以节点 ...

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

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

  7. Linq to Xml读取复杂xml&lpar;带命名空间&rpar;

    前言:xml的操作方式有多种,但要论使用频繁程度,博主用得最多的还是Linq to xml的方式,觉得它使用起来很方便,就用那么几个方法就能完成简单xml的读写.之前做的一个项目有一个很变态的需求:C ...

  8. 由&OpenCurlyDoubleQuote;Jasperrpeorts 4&period;1&period;2升级到5&period;1&period;2对flex项目的解析”到AS3 带命名空间的XML的操作

    原文同步至:http://www.waylau.com/from-jasperrpeorts-4-1-2-upgraded-to-5-1-2-parsing-of-flex-projects-to-t ...

  9. 如何:控制命名空间前缀 &lpar;C&num;&rpar; &lpar;LINQ to XML&rpar;

    Visual Studio 2010 本主题介绍在序列化 XML 树时如何控制命名空间前缀. 在很多情况下,不需要控制命名空间前缀. 但是,某些 XML 编程工具需要命名空间前缀的特定控制. 例如,您 ...

随机推荐

  1. display&colon;inline-block的间隙问题和解决办法

    1.display:inline-block在水平方向的间隙: 代码如下: <style type="text/css"> *{margin:0; padding:0; ...

  2. 【转】&lbrack;caffe&rsqb;深度学习之图像分类模型AlexNet解读

    [caffe]深度学习之图像分类模型AlexNet解读 原文地址:http://blog.csdn.net/sunbaigui/article/details/39938097   本文章已收录于: ...

  3. Apache CXF实现Web Service(1)——不借助重量级Web容器和Spring实现一个纯的JAX-WS web service

    废话少说,先在Eclipse中新建一个Java Project (可以不是WTP的Dynamic Web Project) 选择Java Project 再看pom.xml 我们使用cxf 3.1.4 ...

  4. byte&lbrack;&rsqb; 清空

    1. using(byte buff = new byte[Size]){  // 你要用的代码,} 2. Array.Clear(bytes, 0 ,bytes.Length);

  5. Windows下Subversion和Apache的安装及配置&lpar;一)

    1.序 Subversion可谓版本控制软件中的佼佼者,其开源性,易用性已受到众多软件开发者首选的版本控制软件.在这里我想记录我安装Subversion和Apache的过程.注意,Subversion ...

  6. php 前端获取数据

    <pre name="code" class="python"><!doctype html> <html lang=" ...

  7. noip 2016 提高组总结(不是题解)

    小弱鸡杨树辰是第一次参加像noip这样的高大上的比赛,于是他非常,非常,非常激动. 当他第二天考完试后,他正在yy自己的分数:day1T1应该是a掉了,T2写了个30分的暴力,T3也是个40分的暴力, ...

  8. iOS Swift WisdomScanKit图片浏览器功能SDK

    iOS Swift WisdomScanKit图片浏览器功能SDK使用 一:简介      WisdomScanKit 由 Swift4.2版编写,完全兼容OC项目调用. WisdomScanKit的 ...

  9. 推荐一个文献翻译软件--Deja Vu X

    首先我的这篇博客推荐的软件并非你觉得翻译精确度有多高的软件,假设是这种话就不用往下看了,免得浪费时间,仅仅是一个对于翻译文献非常方便的工具,方面在哪请看下文. 我是不会告诉你凡事用过这个软件的人都说好 ...

  10. css3画半圆 , 加上一点动画

    border-radius制作半圆与制作圆形的方法是一样的,只是元素的宽度与圆角方位要配合一致,不同的宽度和高度比例,以及圆角方位,可以制作上半圆.下半圆.左半圆和右半圆效果.例如: .semicir ...