C# 解析XML和反序列化的示例

作者:慌鼠 时间:2023-02-20 01:16:52 

本次为了记录开发一个基于webservice接口,去解析对方传送过来的xml字符串。实际使用时遇到的一些问题。

传输过来的xml格式大致如下:


<?xml version="1.0" encoding="UTF-8"?>
<messages xmlns="http://www.test.com/hit/rhin" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.test.com/hit/rhin file:///e:/request_message.xsd">
   <heartbeat/>
   <switchset></switchset>
   <business>
       <datasets>
           <setdetails>
               <WS02_01>内容</WS02_01>
           </setdetails>
           <setdetails>
               <WS02_01>内容</WS02_01>
           </setdetails>
       </datasets>
   </business>
</messages>
  • xmlns 是默认的命名空间,在有命名空间情况下,需要使用XmlNamespaceManager进行处理。

  • xmlns:xsi 定义了一个命名空间前缀 xsi 对应的唯一字符串 www.w3.org/2001/XMLSch… ,而且这个 xmlns:xsi 在不同的 xml 文档中似乎都会出现。 这是因为 xsi 已经成为了一个业界默认的用于 XSD(XML Schema Definition) 文件的命名空间。 而 XSD 文件(也常常称为 Schema 文件)是用来定义 xml 文档结构的。

XML 解析器可以根据 一个 XSD 文件的内容来解析另一个 XML 文件, 判断该文件的结构 是否和 XSD 文件中定义的一致。 XSD 文件 可以理解为 XML 文档可以自定义的语法或格式检查器。

  • xsi:schemaLocation 是一个由空格分开的键值对,前一个 键 www.test.com/hit/rhin 是命名空间, 是一个全局唯一字符串。后一个 值 是XSD location URI , 这个值指示了前一个命名空间所对应的 XSD 文件的位置, xml parser 可以利用这个信息获取到 XSD 文件, 从而通过 XSD 文件对所有属于 命名空间 www.test.com/hit/rhin 的元素结构进行校验, 因此这个值必然是可以访问的, 且访问到的内容是一个 XSD 文件的内容

具体实现代码:


   //读取xml
   XmlDocument xml = new XmlDocument();
   xml.LoadXml(XMLData);
   //命名空间处理
   XmlNamespaceManager m = new XmlNamespaceManager(xml.NameTable);
   m.AddNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance");
   m.AddNamespace("d", "http://www.test.com/hit/rhin"); //d是随意的一个命名

//读取数据节点,需要带上命名空间m
   XmlNodeList dataNodeList = xml.SelectNodes("d:messages/d:business/d:datasets/d:setdetails", m);
   if (dataNodeList != null && dataNodeList.Count > 0)
   {
       for (int i = 0; i < dataNodeList.Count; i++)
       {
           var model =  XmlToEntity<TestModel>(dataNodeList[i].OuterXml,"http://www.test.com/hit/rhin");
       }

}

XmlToEntity方法 将xml反序列化到Model实体上。


   privated T XmlToEntity<T>(string xml, string nameSpace)
   {
       T obj = default(T);
       try
       {
           XmlRootAttribute root = new XmlRootAttribute("setdetails");
           root.Namespace = nameSpace;//带命名空间的操作
           XmlSerializer serializer = new XmlSerializer(typeof(T),root);

StringReader sr = new StringReader(xml);
           obj = (T)serializer.Deserialize(sr);
           sr.Close();
       }
       catch (Exception ex)
       {
           Console.WriteLine(ex.Message);
       }
       return obj;
   }

实体定义也需要说明命名空间


   [XmlRoot(Namespace = "http://www.test.com/hit/rhin", IsNullable = false, ElementName = "setdetails")]
   [Table("TAB_TEST")]
   public class TestModel
   {
       [XmlElement("WS02_01")]
       public string  NEIRONG { get; set; }
   }

来源:https://juejin.cn/post/6956445778579554311

标签:c#,xml,反序列化
0
投稿

猜你喜欢

  • 详解SpringBoot+SpringSecurity+jwt整合及初体验

    2023-11-28 23:54:48
  • Android实现掷骰子效果

    2022-06-16 01:09:16
  • springboot集成fastDfs过程代码实例

    2023-02-21 19:42:20
  • JDK1.8中的ConcurrentHashMap源码分析

    2023-11-27 06:02:32
  • Android 中Activity 之间传递参数

    2022-09-06 04:29:20
  • Android View与Compose互相调用实例探究

    2021-06-11 09:07:29
  • 解读JDK8踩坑JCE加密限制版本问题

    2021-09-20 12:42:35
  • Android实现简单的照相功能

    2023-07-01 08:46:16
  • C#创建、读取和修改Excel的方法

    2023-02-24 06:28:16
  • Flutter绘图组件之CustomPaint使用详解

    2021-12-13 01:26:06
  • 详解Asp.Net MVC的Bundle捆绑

    2021-09-10 05:21:38
  • C#实现异步的常用方式总结

    2023-10-26 17:25:13
  • c#生成验证码程序

    2023-01-08 18:38:59
  • SpringRetry重试框架的具体使用

    2022-09-21 00:37:35
  • Java容器类源码详解 Deque与ArrayDeque

    2021-10-15 12:43:21
  • Spring boot通过切面,实现超灵活的注解式数据校验过程

    2022-11-29 07:40:08
  • Jmeter生成UUID作为唯一标识符过程图解

    2022-09-17 03:35:36
  • C# task应用实例详解

    2023-01-22 05:23:53
  • java通过ip获取客户端Mac地址的小例子

    2021-12-22 06:37:07
  • C#集合之可观察集合的用法

    2022-02-16 13:43:13
  • asp之家 软件编程 m.aspxhome.com