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

本次为了记录开发一个基于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; }
    }

以上就是C# 解析XML和反序列化的示例的详细内容,更多关于C# 解析XML和反序列化的资料请关注我们其它相关文章!

(0)

相关推荐

  • C#实现复杂XML的序列化与反序列化

    本文以一个实例的形式讲述了C#实现复杂XML的序列化与反序列化的方法.分享给大家供大家参考.具体方法如下: 已知.xml(再此命名default.xml)文件,请将其反序列化到一个实例对象. Default.XML文件如下: <?xml version="1.0" encoding="utf-8" ?> <config> <rules> <rule name="namea"> <params&

  • C#实现Xml序列化与反序列化的方法

    本文实例讲述了C#实现Xml序列化与反序列化的方法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: /// <summary> /// Xml序列化与反序列化 /// </summary> public class XmlUtil { public static string GetRoot(string xml) {     XmlDocument doc = new XmlDocument();     doc.LoadXml(xml.Replace("

  • C#中将xml文件反序列化为实例时采用基类还是派生类的知识点讨论

    基类: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace DeserializeTest { public class SettingsBase { private string m_fileName; public string FileName { get { return m_fileName; } set { m_fileName = value;

  • 详解 C# 中XML对象的序列化和反序列化

    这一篇主要是用来介绍关于C#中的XML序列化的问题,这个相信大家一定会经常使用它,特别是在WPF中,有时候我们需要将我们后台的数据保存在数据库中,从而在软件下一次启动的时候能够自动去加载这些数据,由于我们的这些Model中字段众多,如果单独进行保存那是不太现实的,这个时候将这些字段序列化成xml字符串并保存在数据库中就是一个不错的选择,当我们需要这些数据的时候我们也可以反过来将其序列化为一些字段,最终达到我们的效果,首先我们来看看是如何实现的? public class XMLUtil {   

  • C#实现XML与实体类之间相互转换的方法(序列化与反序列化)

    本文实例讲述了C#实现XML与实体类之间相互转换的方法.分享给大家供大家参考,具体如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; using System.Data; using System.Xml; using System.Xml.Serialization; /// <summary> /// Xml序列化与反序列化 //

  • c#正反序列化XML文件示例(xml序列化)

    复制代码 代码如下: using System.Collections.Generic;using System.Linq;using System.Reflection;using System.Text;using System.Text.RegularExpressions;using System.Xml.Serialization;using System.IO;using System; namespace GlobalTimes.Framework{    /// <summar

  • C#实现xml文件反序列化读入数据到object的方法

    本文实例讲述了C#实现xml文件反序列化读入数据到object的方法.分享给大家供大家参考.具体实现方法如下: public static object DeSerializeFromXmlString(System.Type typeToDeserialize, string xmlString) { byte[] bytes = System.Text.Encoding.UTF8.GetBytes(xmlString); MemoryStream memoryStream = new Mem

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

    本次为了记录开发一个基于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&

  • Java中使用DOM和SAX解析XML文件的方法示例

    dom4j介绍 dom4j的项目地址:http://sourceforge.net/projects/dom4j/?source=directory dom4j是一个简单的开源库,用于处理XML. XPath和XSLT,它基于Java平台,使用Java的集合框架,全面集成了DOM,SAX和JAXP. dom4j的使用 下载了dom4j项目之后,解压缩,将其jar包(我的当前版本叫做dom4j-1.6.1.jar)加入class path下面. (Properties->Java Build Pa

  • 在java中使用dom4j解析xml(示例代码)

    虽然Java中已经有了Dom和Sax这两种标准解析方式 但其操作起来并不轻松,对于我这么一个初学者来说,其中部分代码是活生生的恶心 为此,伟大的第三方开发组开发出了Jdom和Dom4j等工具 鉴于目前的趋势,我们这里来讲讲Dom4j的基本用法,不涉及递归等复杂操作 Dom4j的用法很多,官网上的示例有那么点儿晦涩,这里就不写了 首先我们需要出创建一个xml文档,然后才能对其解析 xml文档: 复制代码 代码如下: <?xml version="1.0" encoding=&quo

  • jquery解析xml字符串示例分享

    第一种方案: 复制代码 代码如下: <script type="text/javascript">$(document).ready(function() { $.ajax({    url: 'http://www.test.net/cgi/test.xml',    dataType: 'xml',    success: function(data){     //console.log(data);    $(data).find("channel&quo

  • Python中使用ElementTree解析XML示例

    [XML基本概念介绍] XML 指可扩展标记语言(eXtensible Markup Language). XML 被设计用来传输和存储数据. 概念一: 复制代码 代码如下: <foo>      # foo元素的起始标签  </foo>     # foo元素的结束标签             # note: 每一个起始标签必须有对应的结束标签来闭合, 也可以写成<foo/> 概念二: 复制代码 代码如下: <foo>           # 元素可以嵌套

  • java中四种生成和解析XML文档的方法详解(介绍+优缺点比较+示例)

    众所周知,现在解析XML的方法越来越多,但主流的方法也就四种,即:DOM.SAX.JDOM和DOM4J 下面首先给出这四种方法的jar包下载地址 DOM:在现在的Java JDK里都自带了,在xml-apis.jar包里 SAX:http://sourceforge.net/projects/sax/ JDOM:http://jdom.org/downloads/index.html DOM4J:http://sourceforge.net/projects/dom4j/  一.介绍及优缺点分析

  • 深入分析XmlSerializer对象的Xml序列化与反序列化的示例详解

    这篇随笔对应的.Net命名空间是System.Xml.Serialization:文中的示例代码需要引用这个命名空间.为什么要做序列化和反序列化?.Net程序执行时,对象都驻留在内存中:内存中的对象如果需要传递给其他系统使用:或者在关机时需要保存下来以便下次再次启动程序使用就需要序列化和反序列化.范围:本文只介绍xml序列化,其实序列化可以是二进制的序列化,也可以是其他格式的序列化.看一段最简单的Xml序列化代码 复制代码 代码如下: class Program{    static void

  • Java Stax解析XML示例

    package org.itat.stax; import java.io.IOException; import java.io.InputStream; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.stream.E

  • Python 解析xml文件的示例

    1.获取xml树 import xml.etree.ElementTree as ET def getTree(xmlName): xmlName = xmlName.strip() try: tree = ET.parse(xmlName) except: tree = None print 'Analysis xml file fail,file name: {}'.format(xmlName) return tree 2.获取根节点 def getRoot(tree): if tree

  • Java使用SAX解析xml的示例

    一.SAX解析xml简介 SAX是Simple API for Xml的简写,主要功能是用于对xml文档进行解析.由于该方式采用的是事件驱动(callback回调机制)解析方式,所以有速度快.占内存少的优点,当然这些优点也仅限于xml的读取操作,SAX是无法对读取的XML元素进行修改的.如果要修改节点元素则需要使用DOC方式进行将xml文件读取,它会将xml读取成document树结构对象,这样可用对节点元素进行编辑操作:DOC方式的缺点也比较明显:占内存大.解析速度较慢. 所以仅用于读取xml

随机推荐