簡體   English   中英

如何將 XML 解析為 C# Object

[英]How to parse XML to C# Object

我關注 xml。 如何將此 XML 解析為 C# object? 我將嘗試使用帶有 model 上的屬性的 XMLserializer 來完成,但它不起作用。

    <diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1">
  <NewDataSet xmlns="">
    <dtEmp diffgr:id="dtEmp1" msdata:rowOrder="0" diffgr:hasChanges="inserted">
      <ID>4</ID>
      <Name>Hypersoft</Name>
      <FName />
      <Alias />
      <RevierVon>0</RevierVon>
      <RevierBis>0</RevierBis>
      <ZugangAlleTische>1</ZugangAlleTische>
      <AutoKeyNr>0</AutoKeyNr>
      <CardUID>00000000</CardUID>
      <OrigKey>0F9A820100000000</OrigKey>
      <EmpFoto>weiss.jpg</EmpFoto>
      <FotoLink></FotoLink>
      <FotoData>sagsd</FotoData>
    </dtEmp>
    <dtEmp diffgr:id="dtEmp2" msdata:rowOrder="1" diffgr:hasChanges="inserted">
      <ID>5</ID>
      <Name>Kellner 01</Name>
      <FName />
      <Alias />
      <RevierVon>0</RevierVon>
      <RevierBis>0</RevierBis>
      <ZugangAlleTische>0</ZugangAlleTische>
      <AutoKeyNr>0</AutoKeyNr>
      <CardUID />
      <OrigKey />
      <EmpFoto>hoffmann.jpg</EmpFoto>
      <FotoLink></FotoLink>
      <FotoData>dsafasa</FotoData>
    </dtEmp>
  </NewDataSet>
</diffgr:diffgram>

我正在使用以下代碼

 public T Deserialize(List<XElement> elements)
{
    try
    {

        object res = null;
        foreach (var element in elements)
        {
            if (!string.IsNullOrEmpty(element.Value))
            {
                XElement xElement = XElement.Parse(element.ToString());

                using (StringReader reader = new StringReader(xElement.ToString()))
                {
                    XmlSerializer xmlSerializer = new XmlSerializer(typeof(T));
                    var entity = (T) xmlSerializer.Deserialize(reader);
                    return entity;
                }
            }
        }

        return (T) res;
    }
    catch (Exception e)
    {
        Console.WriteLine(e);
        throw;
    }
}

以下結果 model:

 [XmlRoot("diffgr:diffgram")]
    public class EmployeeResponse
    {
        [XmlArray("NewDataSet")]
        [XmlArrayItem("dtEmp")]
        public EmployeeDto[] Employees { get; set; }
    }

    public class EmployeeDto
    {
        [XmlAttribute("ID")]
        public int Id { get; set; }

        [XmlAttribute("Name")]
        public string Name { get; set; }

        [XmlAttribute("FNAme")]
        public string FNAme { get; set; }

        [XmlAttribute("Alias")]
        public string Alias { get; set; }

        [XmlAttribute("RevierVon")]
        public int RevierVon { get; set; }

        [XmlAttribute("RevierBis")]
        public int RevierBis { get; set; }

        [XmlAttribute("ZugangAllTische")]
        public byte ZugangAllTische { get; set; }

        [XmlAttribute("AutoKeyNr")]
        public short AutoKeyNr { get; set; }

        [XmlAttribute("CardUID")]
        public string CardUID { get; set; }

        [XmlAttribute("OrigKey")]
        public string OrigKey { get; set; }

        [XmlAttribute("EmpFoto")]
        public string EmpFoto { get; set; }

        [XmlAttribute("FotoLink")]
        public string FotoLink { get; set; }

        [XmlAttribute("FotoData")]
        public byte[] FotoData { get; set; }
    }

我的 foreach 圈子出現了某種反序列化異常。 我想,我的 class 和字段上的屬性是錯誤的。

嘗試以下操作:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Serialization;
using System.Xml.Linq;
using System.IO;

namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";

         static void Main(string[] args)
        {
            XDocument doc = XDocument.Load(FILENAME);


            List<XElement> diffgram = doc.Descendants().Where(x => x.Name.LocalName == "diffgram").ToList();
            MyDeserialize<EmployeeResponse> serializer = new MyDeserialize<EmployeeResponse>();
            EmployeeResponse response = (EmployeeResponse)serializer.Deserialize(diffgram);

        }
    }
    public class MyDeserialize<T> where T : new()
    {
        public T Deserialize(List<XElement> elements)
        {
            try
            {

                object res = null;
                foreach (var element in elements)
                {
                    if (!string.IsNullOrEmpty(element.Value))
                    {
                        XElement xElement = XElement.Parse(element.ToString());

                        using (StringReader reader = new StringReader(xElement.ToString()))
                        {
                            XmlSerializer xmlSerializer = new XmlSerializer(typeof(T));
                            var entity = (T)xmlSerializer.Deserialize(reader);
                            return entity;
                        }
                    }
                }

                return (T)res;
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                throw;
            }
        }
    }

    [XmlRoot(ElementName = "diffgram", Namespace = "urn:schemas-microsoft-com:xml-diffgram-v1")]
    public class EmployeeResponse
    {
        [XmlArray("NewDataSet", Namespace = "")]
        [XmlArrayItem("dtEmp", Namespace = "")]
        public EmployeeDto[] Employees { get; set; }


    }

    public class EmployeeDto
    {
        [XmlElement("ID")]
        public int Id { get; set; }

        [XmlElement("Name")]
        public string Name { get; set; }

        [XmlElement("FNAme")]
        public string FNAme { get; set; }

        [XmlElement("Alias")]
        public string Alias { get; set; }

        [XmlElement("RevierVon")]
        public int RevierVon { get; set; }

        [XmlElement("RevierBis")]
        public int RevierBis { get; set; }

        [XmlElement("ZugangAllTische")]
        public byte ZugangAllTische { get; set; }

        [XmlElement("AutoKeyNr")]
        public short AutoKeyNr { get; set; }

        [XmlElement("CardUID")]
        public string CardUID { get; set; }

        [XmlElement("OrigKey")]
        public string OrigKey { get; set; }

        [XmlElement("EmpFoto")]
        public string EmpFoto { get; set; }

        [XmlElement("FotoLink")]
        public string FotoLink { get; set; }

        [XmlElement("FotoData")]
        public byte[] FotoData { get; set; }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM