zoukankan      html  css  js  c++  java
  • XML系列之--创建电文格式的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>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>

    对于这种方式写操作,思路是: 一层一层进行,然后进行拼接,命名空间尤其是带前缀的,用 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","01"))
    
    ,
    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","0000")))) 
    
    );
    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>01</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>123</x2:SecondInform>
         <x2:Status>
          <x2:StatusCode>0000</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","01"))
                                           
           ),
        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","123"),
                new XElement(x2 + "Status",
                new XElement(x2+"StatusCode","0000"))                                                      
                               
              )                                                           
           )                  
        );
      Console.WriteLine(root);     
    }

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

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

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

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

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

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

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

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

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

  • 相关阅读:
    69. 二叉树的层次遍历
    17. 子集(Subsets)
    33. N皇后问题(回溯)
    15. 全排列
    53. 数字组合 II
    135. 数字组合
    95. 验证二叉查找树
    88. 最近公共祖先
    245. 子树
    [python应用]python简单图片抓取
  • 原文地址:https://www.cnblogs.com/Sientuo/p/6054284.html
Copyright © 2011-2022 走看看