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

XML作为一种可扩展的标记语言,可以一种简单文本格式存储数据的方式,被任何计算机读取。非常灵活。标准的XML格式(分层组织)是包含一个版本信息的节点(第一行),和一个可包含多级层级节点的根结点。和HTML不同的是,XML的节点名称、节点属性等可自定义,并区别大小写,这点反映了其灵活性。

关于XML节点的内容,包含命名空间(前缀)、属性。至于命名空间是个啥,其实也很好理解,如两军开战,兵卒厮杀,为了识别己方人员,不同的衣服、装饰这些都是所谓的马甲。命名空间也是同样的道理。穿上马甲,表明自己身份,是谁手下的兵,该归谁管。

完整的Soap格式的XML就我目前遇到的分为两种:

1. 带层级的包含命名空间,就是x0里面包含的X1,x2Body里面包含x3、x4 ,而不是单层存在

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <x0:Envelope xmlns:x0="http://www.w3school.com.cn/Envelope" xmlns:x1="http://www.w3school.com.cn/Header">
  3. <x1:Header>
  4. <x1:Type>ICC</x1:Type>
  5. <x1:Version></x1:Version>
  6. </x1:Header>
  7. <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">
  8. <x3:SecondInform>
  9. <x4:Status>
  10. <x4:StatusCode></x4:StatusCode>
  11. </x4:Status>
  12. </x3:SecondInform>
  13. </x2:Body>
  14. </x0:Envelope>

对于这种方式写操作,思路是: 一层一层进行,然后进行拼接,命名空间尤其是带前缀的,用 XElement 来处理,引用的具体来源,用 XAttribute 来表示,此外对于标签数据的写入,同样也是用XElement元素,格式是:XElement(命名空间,"标签名","标签值"),对于子节点的话,就是嵌套,在第三个参数标签值的位置上,再New Element元素即可

  1. public void CreateXML()
  2. {
  3. //寫入命名空間
  4. XNamespace x0 = @"http://www.w3school.com.cn/Envelope";
  5. XNamespace x1 = @"http://www.w3school.com.cn/Header";
  6. XNamespace x2 = @"http://www.w3school.com.cn/Body";
  7. XNamespace x3 = @"http://www.w3school.com.cn/IBBC/01";
  8. XNamespace x4 = @"http://www.w3school.com.cn/ICCB/01";
  9. //創建根元素
  10. XElement root = new XElement(x0+"Envelop",new XAttribute(XNamespace.Xmlns+"x0",x0.NamespaceName),
  11.  
  12. new XAttribute(XNamespace.Xmlns+"x1",x1.NamespaceName),
  13. new XElement(x1+"Header",
  14. new XElement(x1+"Type","ICC"),
  15. new XElement(x1+"Version",""))
  16.  
  17. ,
  18. new XElement(x2+"Body",new XAttribute(XNamespace.Xmlns+"x2",x2.NamespaceName),
  19. new XAttribute(XNamespace.Xmlns+"x3",x3.NamespaceName),
  20. new XAttribute(XNamespace.Xmlns+"x4",x4.NamespaceName),
  21. new XElement(x3 + "SecondInform",
  22. new XElement(x4 + "Status",
  23. new XElement(x4 + "StatusCode",""))))
  24.  
  25. );
  26. Console.WriteLine(root);
  27. }

2. 对于纯单层级的命名空间,就是x0标签中只有x0,x1则在其下一个标签

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <x0:Envelop xmlns:x0="http://www.w3school.com.cn/Envelope">
  3. <x1:Header xmlns:x1="http://www.w3school.com.cn/Header">
  4. <x1:Header>
  5. <x1:Type>ICC</x1:Type>
  6. <x1:Version></x1:Version>
  7. </x1:Header>
  8. </x1:Header>
  9. <x1:Body xmlns:x1="http://www.w3school.com.cn/Body">
  10. <x2:IBBC xmlns:x2="http://www.w3school.com.cn/IBBC/01">
  11. <x2:SecondInform></x2:SecondInform>
  12. <x2:Status>
  13. <x2:StatusCode></x2:StatusCode>
  14. </x2:Status>
  15. </x2:IBBC>
  16. </x1:Body>
  17. </x0:Envelop>

如果要创建这种格式的XML,总的来说和第一种的思路是完全一样,我理解的不同就是,层级关系改变了,所以在写操作的时候,部分代码需要对应的调整,只要掌握了思想,不管嵌套多少层,一层一层的进行写入,进行调试,就不会出错,如下

  1. public void CreateXML()
  2. {
  3. //寫入命名空間
  4. XNamespace x0 = @"http://www.w3school.com.cn/Envelope";
  5. XNamespace x1h = @"http://www.w3school.com.cn/Header";
  6. XNamespace x1b = @"http://www.w3school.com.cn/Body";
  7. XNamespace x2 = @"http://www.w3school.com.cn/IBBC/01";
  8. //創建根元素
  9. XElement root = new XElement(x0+"Envelop",new XAttribute(XNamespace.Xmlns+"x0",x0.NamespaceName),
  10.  
  11. new XElement(x1h+"Header",new XAttribute(XNamespace.Xmlns+"x1",x1h.NamespaceName),
  12. new XElement(x1h+"Header",
  13. new XElement(x1h+"Type","ICC"),
  14. new XElement(x1h+"Version",""))
  15.  
  16. ),
  17. new XElement(x1b+"Body",new XAttribute(XNamespace.Xmlns+"x1",x1b.NamespaceName),
  18. new XElement(x2+"IBBC",new XAttribute(XNamespace.Xmlns+"x2",x2.NamespaceName),
  19. new XElement(x2+"SecondInform",""),
  20. new XElement(x2 + "Status",
  21. new XElement(x2+"StatusCode",""))
  22.  
  23. )
  24. )
  25. );
  26. Console.WriteLine(root);
  27. }

很多時候要求的是动态的XML,比如在某个指定节点下循环插入某个数据源(数据库)中的数据,对于此类,需要两步走,第一,获取指定位置的节点,第二在该位置下插入数据,至于循环的话,FOR语句即可处理,如下

  1. //获取插入点元素
  2. XElement LocNode = root.Descendants(x2 + "StatusCode").FirstOrDefault();
  3. //需要循环创建的xml节点
  4. for (int i = ; i < dt.Rows.Count; i++)
  5. {
  6. XElement Transnode = new XElement(x2 + "CollRec",
  7. new XElement(x2 + "NewNode", dt.Rows[i][]),
  8. new XElement(x2 + "TwoNode",
  9. new XElement(x2 + "Test1", dt.Rows[i][]),
  10. new XElement(x2 + "Test2", dt.Rows[i][]))
  11. );
  12. //在指定节点下插入新元素
  13. LocNode.AddAfterSelf(Transnode);
  14. }

如此便已成功创建完复杂电文格式的XML。后面的话我会陆续介绍关于复杂XML操作的更多说明,包括解析、简单操作、以及其他复杂类型的XML。

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

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

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

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

--旧时王谢堂前燕,飞入寻常百姓家

--市人皆大笑,举手揶揄之

XML系列之--创建电文格式的XML(一)的更多相关文章

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

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

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

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

  3. XML新手入门 创建构造良好的XML(1)

    XML新手入门 创建构造良好的XML(1) 2009-03-19 09:24 Kay Whatley IBM Developerworks 我要评论(0) 字号:T | T 本文描述了构建良好的XML ...

  4. XML新手入门 创建构造良好的XML(2)

    本文描述了构建良好的XML需要遵循的规则.作者详细介绍了构建XML需要考虑的元素,如何命名约定.正确的标记嵌套.属性规则.声明和实体,以及DTD和schema的验证,十分便于新手开始学习了解XML. ...

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

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

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

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

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

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

  8. 编写Java程序,使用 dom4j 创建一个 XML 文档,文档名为“city.xml”。注意该文档的格式和数据

    查看本章节 查看作业目录 需求说明: 使用 dom4j 创建一个 XML 文档,文档名为"city.xml".该文档的格式和数据如图所示 实现思路: 创建Java项目,添加dom4 ...

  9. 比較全的XML系列工具 能够轻松实现排版、转换和打印!

    XML系列 --------------------------------------------------------------------------------1.Xsl Formatte ...

随机推荐

  1. ECharts图形库

    ECharts图形库百度的项目,图形的创建也比较简单,直接引用Javascript即可 1,引入<script src="{{ url_for("static",f ...

  2. install python in wine

    wget http://www.kegel.com/wine/winetricks chmod +x winetricks ./winetricks 钩选msxml3就可以了. ___________ ...

  3. IIS下实现帝国CMS搜索页伪静态

    前面ytkah讲了apache下帝国CMS搜索页伪静态实现方法,网友说服务器是用IIS,那么IIS下如何实现帝国CMS搜索页伪静态呢?首先得先有URL重写插件,下载地址:http://www.iis. ...

  4. RN animated缩放动画

    效果图: 代码: import React, {Component} from 'react'; import { AppRegistry, StyleSheet, Text, Animated, T ...

  5. HttpUrlConneciton上传JSON数据

    try { //创建连接 URL url = new URL(url); HttpURLConnection connection = (HttpURLConnection) url.openConn ...

  6. 升级my.cnf注意

    升级my.cnf注意 mkdir -p /ngbs/data/{logs,tmp} vi  /etc/init.d/mysqlbasedir=/usr/local/mysql datadir=/ngb ...

  7. 下载ez_setup

    1.下载ez_setup链接:https://pypi.org/project/ez_setup/#files

  8. 003-读书笔记-企业IT架构转型之道-阿里巴巴中台战略思想与架构实战-分布式服务框架的选择

    3.1.淘宝平台“服务化”历程 大约2007年,淘宝500人团队,维护一个war包,200多个功能模块. 1)项目团队协同成本高,业务响应越来越慢 2)应用复杂度超出人的认知负载. 3)错误难于隔离[ ...

  9. jQuery-velocity.js 插件的简易使用

    初识Velocity动画,感觉它并没有那么强大,但是渐渐感觉它的ui动画可以让我们简易的使用到我们的项目中. Velocity动画的简介: 下载地址:http://www.julian.com/res ...

  10. @property用法总结

    1.当方法需要传入别的参数时,不能定义成@property. 比如_table(self, owner)