C# XML 解析样例

XML 和 SOAP 序列化

1、Controller

using System;
using System.Collections.Generic;
using System.Text;
using System.Xml;
using System.Xml.Serialization;
using Microsoft.AspNetCore.Mvc;

namespace WebApplication.Controllers
{
    [Route("[controller]")]
    [ApiController]
    public class ValuesController : ControllerBase
    {
        [HttpGet("e")]
        public IActionResult e()
        {
            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.Load(@"D:\5.xml");//Load加载XML文件,LoadXML加载XML字符串
            PRPM_IN406110UV01 xml1 = XmlUtil.XmlDeserialize<PRPM_IN406110UV01>(xmlDoc.InnerXml, Encoding.UTF8);
            return Ok(new { data = xml1 });
        }
    }
}

2、5.xml文件【不能带有xsi:type="***"相关内容,如果有请替换掉】

<PRPM_IN406110UV01>
    <receiver typeCode="RCV">
        <device classCode="DEV" determinerCode="INSTANCE"></device>
    </receiver>
    <sender typeCode="SND">
        <device classCode="DEV" determinerCode="INSTANCE"></device>
    </sender>
    <acknowledgement typeCode="AA"></acknowledgement>
    <controlActProcess classCode="CACT" moodCode="EVN">
        <subject typeCode="SUBJ">
            <registrationEvent classCode="REG" moodCode="EVN">
                <statusCode code="active"/>
                <subject1 typeCode="SBJ">
                    <assignedEntity classCode="ASSIGNED ">
                        <id>
                            <item extension="0157" root="2.16.156.10011.1.26"/>
                        </id>
                        <name>
                            <item>
                                <part value="123"/>
                            </item>
                        </name>
                        <statusCode code="active"/>
                        <assignedPrincipalOrganization classCode="ORG" determinerCode="INSTANCE">
                            <name>
                                <item>
                                    <part value="456"/>
                                </item>
                            </name>
                        </assignedPrincipalOrganization>
                    </assignedEntity>
                </subject1>
            </registrationEvent>
        </subject>
    </controlActProcess>
</PRPM_IN406110UV01>

3、实体类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Xml.Serialization;

namespace WebApplication
{
    //[XmlType(TypeName = "PRPM_IN406110UV01")]
    [XmlRoot("PRPM_IN406110UV01")]
    public class PRPM_IN406110UV01
    {
        public Receiver receiver { get; set; }
        public Sender sender { get; set; }
        public Acknowledgement acknowledgement { get; set; }

        [XmlArray("controlActProcess")]
        public List<Subject> controlActProcess { get; set; }
    }

    [XmlType(TypeName = "receiver")]
    public class Receiver
    {
        [XmlAttribute]
        public string typeCode { get; set; }

        public Device device { get; set; }
    }

    [XmlType(TypeName = "sender")]
    public class Sender
    {
        [XmlAttribute]
        public string typeCode { get; set; }

        public Device device { get; set; }
    }

    #region Device
    [XmlType(TypeName = "device")]
    public class Device
    {
        [XmlAttribute]
        public string classCode { get; set; }

        [XmlAttribute]
        public string determinerCode { get; set; }

        public DeviceId id { get; set; }
    }

    [XmlType(TypeName = "id")]
    public class DeviceId
    {
        public DeviceIdItem item { get; set; }
    }

    [XmlType(TypeName = "item")]
    public class DeviceIdItem
    {
        [XmlAttribute]
        public string extension { get; set; }

        [XmlAttribute]
        public string root { get; set; }
    }
    #endregion

    #region controlActProcess
    [XmlType(TypeName = "controlActProcess")]
    public class ControlActProcess
    {
        [XmlAttribute]
        public string classCode { get; set; }

        [XmlAttribute]
        public string moodCode { get; set; }

        //[XmlArray("subject")]
        [XmlElement]
        public List<Subject> subject { get; set; }
    }

    [XmlType(TypeName = "subject")]
    public class Subject
    {
        [XmlAttribute]
        public string typeCode { get; set; }

        public RegistrationEvent registrationEvent { get; set; }
    }

    [XmlType(TypeName = "registrationEvent")]
    public class RegistrationEvent
    {
        [XmlAttribute]
        public string classCode { get; set; }

        [XmlAttribute]
        public string moodCode { get; set; }

        public StatusCode statusCode { get; set; }

        public Subject1 subject1 { get; set; }
    }

    [XmlType(TypeName = "statusCode")]
    public class StatusCode
    {
        [XmlAttribute]
        public string code { get; set; }
    }

    #region Subject1
    [XmlType(TypeName = "subject1")]
    public class Subject1
    {
        [XmlAttribute]
        public string typeCode { get; set; }

        public Subject1AssignedEntity assignedEntity { get; set; }
    }

    #region Subject1AassignedEntity

    [XmlType(TypeName = "assignedEntity")]
    public class Subject1AssignedEntity
    {
        [XmlAttribute]
        public string classCode { get; set; }

        public Subject1AssignedId id { get; set; }

        public Subject1AssignedCode code { get; set; }

        public Subject1AssignedName name { get; set; }

        public Subject1AssignedAssignedPrincipalOrganization assignedPrincipalOrganization { get; set; }
    }

    //[XmlType(TypeName = "id")]
    public class Subject1AssignedId
    {
        public Subject1AssignedIdItem item { get; set; }
    }

    //[XmlType(TypeName = "item")]
    public class Subject1AssignedIdItem
    {
        [XmlAttribute]
        public string extension { get; set; }

        [XmlAttribute]
        public string root { get; set; }
    }
    #endregion

    #region Subject1AssignedCode
    [XmlType(TypeName = "code")]
    public class Subject1AssignedCode
    {
        [XmlAttribute]
        public string code { get; set; }

        [XmlAttribute]
        public string codeSystem { get; set; }

        [XmlAttribute]
        public string codeSystemName { get; set; }

        public Subject1AssignedCodeDisplayName displayName { get; set; }
    }

    [XmlType(TypeName = "displayName")]
    public class Subject1AssignedCodeDisplayName
    {
        [XmlAttribute]
        public string value { get; set; }
    }
    #endregion

    //[XmlType(TypeName = "name")]
    public class Subject1AssignedName
    {
        public Subject1AssignedNameItem item { get; set; }
    }

    //[XmlType(TypeName = "item")]
    public class Subject1AssignedNameItem
    {
        public Subject1AssignedNameItemPart part { get; set; }
    }

    //[XmlType(TypeName = "assignedPrincipalOrganization")]
    public class Subject1AssignedAssignedPrincipalOrganization
    {
        [XmlAttribute]
        public string classCode { get; set; }

        [XmlAttribute]
        public string determinerCode { get; set; }
    }

    [XmlType(TypeName = "part")]
    public class Subject1AssignedNameItemPart
    {
        [XmlAttribute]
        public string value { get; set; }
    }
    #endregion

    #endregion

    #region Acknowledgement
    [XmlType(TypeName = "acknowledgement")]
    public class Acknowledgement
    {
        [XmlAttribute]
        public string typeCode { get; set; }
    }
    #endregion
}

4、XmlUtil

using System;
using System.IO;
using System.Text;
using System.Xml;
using System.Xml.Serialization;

namespace WebApplication
{
    public static class XmlUtil
    {
        /// <summary>
        /// 将一个对象序列化为XML字符串
        /// </summary>
        /// <param name="o">要序列化的对象</param>
        /// <param name="encoding">编码方式</param>
        /// <returns>序列化产生的XML字符串</returns>
        public static string XmlSerialize(object o, Encoding encoding)
        {
            if (o == null)
            {
                throw new ArgumentNullException("o");
            }

            if (encoding == null)
            {
                throw new ArgumentNullException("encoding");
            }

            using (MemoryStream stream = new MemoryStream())
            {
                XmlSerializer serializer = new XmlSerializer(o.GetType());

                XmlWriterSettings settings = new XmlWriterSettings();
                settings.Indent = true;
                settings.NewLineChars = "\r\n";
                settings.Encoding = encoding;
                settings.IndentChars = "  ";
                settings.OmitXmlDeclaration = true;

                using (XmlWriter writer = XmlWriter.Create(stream, settings))
                {
                    //Create our own namespaces for the output
                    XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
                    //Add an empty namespace and empty value
                    ns.Add("", "");
                    serializer.Serialize(writer, o, ns);
                    writer.Close();
                }

                stream.Position = 0;
                using (StreamReader reader = new StreamReader(stream, encoding))
                {
                    return reader.ReadToEnd();
                }
            }
        }

        /// <summary>
        /// 从XML字符串中反序列化对象
        /// </summary>
        /// <typeparam name="T">结果对象类型</typeparam>
        /// <param name="s">包含对象的XML字符串</param>
        /// <param name="encoding">编码方式</param>
        /// <returns>反序列化得到的对象</returns>
        public static T XmlDeserialize<T>(string s, Encoding encoding)
        {
            if (string.IsNullOrEmpty(s))
                throw new ArgumentNullException("s");
            if (encoding == null)
                throw new ArgumentNullException("encoding");

            XmlSerializer mySerializer = new XmlSerializer(typeof(T));
            using (MemoryStream ms = new MemoryStream(encoding.GetBytes(s)))
            {
                using (StreamReader sr = new StreamReader(ms, encoding))
                {
                    return (T)mySerializer.Deserialize(sr);
                }
            }
        }

        /// <summary>
        /// 将一个对象按XML序列化的方式写入到一个文件
        /// </summary>
        /// <param name="o">要序列化的对象</param>
        /// <param name="path">保存文件路径</param>
        /// <param name="encoding">编码方式</param>
        public static void XmlSerializeToFile(object o, string path, Encoding encoding)
        {
            if (string.IsNullOrEmpty(path))
            {
                throw new ArgumentNullException("path");
            }

            if (o == null)
            {
                throw new ArgumentNullException("o");
            }

            if (encoding == null)
            {
                throw new ArgumentNullException("encoding");
            }

            using (FileStream file = new FileStream(path, FileMode.Create, FileAccess.Write))
            {
                XmlSerializer serializer = new XmlSerializer(o.GetType());

                XmlWriterSettings settings = new XmlWriterSettings();
                settings.Indent = true;
                settings.NewLineChars = "\r\n";
                settings.Encoding = encoding;
                settings.IndentChars = "    ";

                using (XmlWriter writer = XmlWriter.Create(file, settings))
                {
                    serializer.Serialize(writer, o);
                    writer.Close();
                }
            }
        }

        /// <summary>
        /// 读入一个文件,并按XML的方式反序列化对象。
        /// </summary>
        /// <typeparam name="T">结果对象类型</typeparam>
        /// <param name="path">文件路径</param>
        /// <param name="encoding">编码方式</param>
        /// <returns>反序列化得到的对象</returns>
        public static T XmlDeserializeFromFile<T>(string path, Encoding encoding)
        {
            if (string.IsNullOrEmpty(path))
                throw new ArgumentNullException("path");
            if (encoding == null)
                throw new ArgumentNullException("encoding");

            string xml = File.ReadAllText(path, encoding);
            return XmlDeserialize<T>(xml, encoding);
        }
    }
}

5、Json数据

{
  "data": {
    "receiver": {
      "typeCode": "RCV",
      "device": {
        "classCode": "DEV",
        "determinerCode": "INSTANCE",
        "id": null
      }
    },
    "sender": {
      "typeCode": "SND",
      "device": {
        "classCode": "DEV",
        "determinerCode": "INSTANCE",
        "id": null
      }
    },
    "acknowledgement": {
      "typeCode": "AA"
    },
    "controlActProcess": [
      {
        "typeCode": "SUBJ",
        "registrationEvent": {
          "classCode": "REG",
          "moodCode": "EVN",
          "statusCode": {
            "code": "active"
          },
          "subject1": {
            "typeCode": "SBJ",
            "assignedEntity": {
              "classCode": "ASSIGNED ",
              "id": {
                "item": {
                  "extension": "0157",
                  "root": "2.16.156.10011.1.26"
                }
              },
              "code": null,
              "name": {
                "item": {
                  "part": {
                    "value": "儿科门诊"
                  }
                }
              },
              "assignedPrincipalOrganization": {
                "classCode": "ORG",
                "determinerCode": "INSTANCE"
              }
            }
          }
        }
      }
    ]
  }
}

*
*
*

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值