Linq创建带命名空间、前缀、Soap格式的XML
关于XML,学校那会,老师在口中仅仅提及,自己也未曾深入接触过,仅是些将最基本XML文件内容显示在web定义的表格中之类的简单操作,如今项目中的收发电文涉及到复杂XML的操作。趁此契机好好回顾下XML知识。
XML作为一种可扩展的标记语言,可以一种简单文本格式存储数据的方式,被任何计算机读取。非常灵活。标准的XML格式(分层组织)是包含一个版本信息的节点(第一行),和一个可包含多级层级节点的根结点。和HTML不同的是,XML的节点名称、节点属性等可自定义,并区别大小写,这点反映了其灵活性。
关于XML节点的内容,包含命名空间(前缀)、属性。至于命名空间是个啥,其实也很好理解,如两军开战,兵卒厮杀,为了识别己方人员,不同的衣服、装饰这些都是所谓的马甲。命名空间也是同样的道理。穿上马甲,表明自己身份,是谁手下的兵,该归谁管。
完整的Soap格式的XML就我目前遇到的分为两种:
1. 带层级的包含命名空间,就是x0里面包含的X1,x2Body里面包含x3、x4 ,而不是单层存在
- <?xml version="1.0" encoding="UTF-8"?>
- <x0:Envelope xmlns:x0="http://www.w3school.com.cn/Envelope" xmlns:x1="http://www.w3school.com.cn/Header">
- <x1:Header>
- <x1:Type>ICC</x1:Type>
- <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>
对于这种方式写操作,思路是: 一层一层进行,然后进行拼接,命名空间尤其是带前缀的,用 XElement 来处理,引用的具体来源,用 XAttribute 来表示,此外对于标签数据的写入,同样也是用XElement元素,格式是:XElement(命名空间,"标签名","标签值"),对于子节点的话,就是嵌套,在第三个参数标签值的位置上,再New Element元素即可
- public void CreateXML()
- {
- //寫入命名空間
- XNamespace x0 = @"http://www.w3school.com.cn/Envelope";
- XNamespace x1 = @"http://www.w3school.com.cn/Header";
- 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";
- //創建根元素
- XElement root = new XElement(x0+"Envelop",new XAttribute(XNamespace.Xmlns+"x0",x0.NamespaceName),
- new XAttribute(XNamespace.Xmlns+"x1",x1.NamespaceName),
- new XElement(x1+"Header",
- new XElement(x1+"Type","ICC"),
- new XElement(x1+"Version",""))
- ,
- new XElement(x2+"Body",new XAttribute(XNamespace.Xmlns+"x2",x2.NamespaceName),
- new XAttribute(XNamespace.Xmlns+"x3",x3.NamespaceName),
- new XAttribute(XNamespace.Xmlns+"x4",x4.NamespaceName),
- new XElement(x3 + "SecondInform",
- new XElement(x4 + "Status",
- new XElement(x4 + "StatusCode",""))))
- );
- Console.WriteLine(root);
- }
2. 对于纯单层级的命名空间,就是x0标签中只有x0,x1则在其下一个标签
- <?xml version="1.0" encoding="utf-8"?>
- <x0:Envelop xmlns:x0="http://www.w3school.com.cn/Envelope">
- <x1:Header xmlns:x1="http://www.w3school.com.cn/Header">
- <x1:Header>
- <x1:Type>ICC</x1:Type>
- <x1:Version></x1:Version>
- </x1:Header>
- </x1:Header>
- <x1:Body xmlns:x1="http://www.w3school.com.cn/Body">
- <x2:IBBC xmlns:x2="http://www.w3school.com.cn/IBBC/01">
- <x2:SecondInform></x2:SecondInform>
- <x2:Status>
- <x2:StatusCode></x2:StatusCode>
- </x2:Status>
- </x2:IBBC>
- </x1:Body>
- </x0:Envelop>
如果要创建这种格式的XML,总的来说和第一种的思路是完全一样,我理解的不同就是,层级关系改变了,所以在写操作的时候,部分代码需要对应的调整,只要掌握了思想,不管嵌套多少层,一层一层的进行写入,进行调试,就不会出错,如下
- public void CreateXML()
- {
- //寫入命名空間
- XNamespace x0 = @"http://www.w3school.com.cn/Envelope";
- XNamespace x1h = @"http://www.w3school.com.cn/Header";
- XNamespace x1b = @"http://www.w3school.com.cn/Body";
- XNamespace x2 = @"http://www.w3school.com.cn/IBBC/01";
- //創建根元素
- XElement root = new XElement(x0+"Envelop",new XAttribute(XNamespace.Xmlns+"x0",x0.NamespaceName),
- new XElement(x1h+"Header",new XAttribute(XNamespace.Xmlns+"x1",x1h.NamespaceName),
- new XElement(x1h+"Header",
- new XElement(x1h+"Type","ICC"),
- new XElement(x1h+"Version",""))
- ),
- new XElement(x1b+"Body",new XAttribute(XNamespace.Xmlns+"x1",x1b.NamespaceName),
- new XElement(x2+"IBBC",new XAttribute(XNamespace.Xmlns+"x2",x2.NamespaceName),
- new XElement(x2+"SecondInform",""),
- new XElement(x2 + "Status",
- new XElement(x2+"StatusCode",""))
- )
- )
- );
- Console.WriteLine(root);
- }
很多時候要求的是动态的XML,比如在某个指定节点下循环插入某个数据源(数据库)中的数据,对于此类,需要两步走,第一,获取指定位置的节点,第二在该位置下插入数据,至于循环的话,FOR语句即可处理,如下
- //获取插入点元素
- XElement LocNode = root.Descendants(x2 + "StatusCode").FirstOrDefault();
- //需要循环创建的xml节点
- for (int i = ; i < dt.Rows.Count; i++)
- {
- XElement Transnode = new XElement(x2 + "CollRec",
- new XElement(x2 + "NewNode", dt.Rows[i][]),
- new XElement(x2 + "TwoNode",
- new XElement(x2 + "Test1", dt.Rows[i][]),
- new XElement(x2 + "Test2", dt.Rows[i][]))
- );
- //在指定节点下插入新元素
- LocNode.AddAfterSelf(Transnode);
- }
如此便已成功创建完复杂电文格式的XML。后面的话我会陆续介绍关于复杂XML操作的更多说明,包括解析、简单操作、以及其他复杂类型的XML。
XML系列之--创建电文格式的XML(一)
XML系列之--解析电文格式的XML(二)
XML系列之--对电文格式XML的简单操作(三)
XML系列之--Linq操作带属性的XML(四)
--旧时王谢堂前燕,飞入寻常百姓家
--市人皆大笑,举手揶揄之
Linq创建带命名空间、前缀、Soap格式的XML的更多相关文章
- Linq解析带命名空间、前缀、Soap格式的XML
关于XML,经常会用到,XML有一般的,同样也有二般的,更不要觉得会操作基础的XML就觉得自己已经精通XML操作,文中是对解析XML的方法进行介绍 1. 一般XML <?xml version= ...
- C#使用Linq To XML读取XML,Linq生成XML,Linq创建带属性或带节点XML
using System; using System.Linq; using System.Xml.Linq; namespace Sample2 { class Program { static v ...
- linq检索带命名空间的xml
XElement el = XElement.Load(fil); XNamespace ns = "http://schemas.microsoft.com/ado/2009/11/edm ...
- XML系列之--Linq操作带属性的XML(四)
关于XML,之前解析过电文收发方面的,就是所谓的带表头.前缀(命名空间)SOAP格式.这次需求是解析一个xml的模板(xls内容),然后填充数据,最后保存.需要时可转换xls.pdf等文件.关于这种带 ...
- XML系列之--创建电文格式的XML(一)
关于XML,学校那会,老师在口中仅仅提及,自己也未曾深入接触过,仅是些将最基本XML文件内容显示在web定义的表格中之类的简单操作,如今项目中的收发电文涉及到复杂XML的操作.趁此契机好好回顾下XML ...
- XML系列之--解析电文格式的XML(二)
上一节介绍了XML的结构以及如何创建.讲到了XML可作为一种简单文本存储数据,把数据存储起来,以XML的方式进行传递.当接收到XML时,必不可少的就是对其进行解析,捞取有效数据,或者将第三方数据以节点 ...
- 如何:控制命名空间前缀 (C#) (LINQ to XML)
Visual Studio 2010 本主题介绍在序列化 XML 树时如何控制命名空间前缀. 在很多情况下,不需要控制命名空间前缀. 但是,某些 XML 编程工具需要命名空间前缀的特定控制. 例如,您 ...
- Linq to Xml读取复杂xml(带命名空间)
前言:xml的操作方式有多种,但要论使用频繁程度,博主用得最多的还是Linq to xml的方式,觉得它使用起来很方便,就用那么几个方法就能完成简单xml的读写.之前做的一个项目有一个很变态的需求:C ...
- 带命名空间的XML的dom4j应用<转>
Element root = document.getRootElement(); List recordenvlist = document.selectNodes("//gm ...
随机推荐
- ES6 ( 三 ) 字符串扩展
一.字符Unicode表示方法 ES6中可以使用以下6种方法表示字符 '\z' === 'z' // true '\172' === 'z' // true '\x7A' === 'z' // tru ...
- 用 Python 排序数据的多种方法
用 Python 排序数据的多种方法 目录 [Python HOWTOs系列]排序 Python 列表有内置就地排序的方法 list.sort(),此外还有一个内置的 sorted() 函数将一个可迭 ...
- mysql索引的一些知识
一.MySQL索引类型 mysql里目前只支持4种索引分别是:full-text,b-tree,hash,r-tree b-tree索引应该是mysql里最广泛的索引的了,除了archive基本所有的 ...
- The method getDispatcherType() is undefined for the type HttpServletRequest
在使用百度的ueditor的时候,老是报错: The method getDispatcherType() is undefined for the type HttpServletRequest 原 ...
- IO口
STM32的每个IO端口都有7个寄存器来控制.他们是:CRH CRL IDR ODR BSRR BRR LCKR.我们常用的IO端口寄存器位CRL CRH IDR ODR.CRL CRH控制着每个IO ...
- iOS 面试题(三):为什么 weakSelf 需要配合 strong self 使用 --转自唐巧
问题 继续回答昨天的问题第二问. 我们知道,在使用 block 的时候,为了避免产生循环引用,通常需要使用 weakSelf 与 strongSelf,写下面这样的代码: __weak typeof( ...
- iOS:使用模板引擎渲染HTML界面
在实际开发中,UIWebView控件接受一个HTML内容,用于相应的界面,下面是该API的接口: - (void)loadHTMLString:(NSString *)string baseURL:( ...
- Python开发【前端】:CSS
css样式选择器 标签上设置style属性: <body> <div style="background-color: #2459a2;height: 48px;" ...
- DER input, Integer tag error的异常处理
1.首先我向大家介绍一下我做的东西,发生这个异常的情况. 我做的是一个电签的系统,在调用某公司的API生成证书,然后与安证通进行同步证书的任务. 2.问题具体的异常 具体异常如下: 2016/08/2 ...
- shell 除法 小数点
比如: num1=2 num2=3 num3=`echo "scale=2; $num1/$num2" | bc` 使用bc工具,sclae控制小数点后保留几位 还有一种方法 aw ...