簡體   English   中英

如何反序列化 System.Xml.Linq.XElement?

[英]How I can deserialize a System.Xml.Linq.XElement?

我試過了:

using (XmlReader reader = XmlReader.Create(_xmlPath))
{
    while (reader.Read())
    {
        if (reader.NodeType.Equals(XmlNodeType.Element) && reader.Name.Equals("Obj"))
        {
            Obj obj = new Obj();
            while (reader.Read())
            {
                if (reader.NodeType.Equals(XmlNodeType.EndElement) && reader.Name.Equals("Obj"))
                    break;
                if (reader.NodeType.Equals(XmlNodeType.Element))
                {
                    switch (reader.Name)
                    {
                        case "Code":
                            obj.Code = reader.ReadElementContentAsString();
                            break;
                        case "Data":
                            XElement el = (XElement) XNode.ReadFrom(reader);
                            XmlReader r = el.CreateReader();
                            XmlSerializer serializer = new XmlSerializer(typeof(Data));
                            Data data = (Data) serializer.Deserialize(r);
                            obj.Data = data;
                            break;
                    }
                }
            }
        }
    }
}

Xml:

<Root>
    <Obj>
        <Code>code</Code>
        <Data>
            <Date>2020-08-07</Date>
            <Amount>1000</Amount>
        </Data>
    </Obj>
</Root>

數據 class:

public class Data{
    public DateTime Date {get;set;}
    public decimal Amount {get;set;}
}

通常,它是一個大的 XML 文件,這就是為什么我嘗試將它切割成碎片並使用 XmlReader 解析它的原因。 反序列化不起作用,如果你有其他方式我是一個接受者

嘗試以下操作:

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

namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XDocument doc = XDocument.Load(FILENAME);
            Data data = doc.Descendants("Data")
                .Select(x => new Data() { Date = (DateTime)x.Element("Date"), Amount = (decimal)x.Element("Amount") }).FirstOrDefault();
        }
    }
    public class Data
    {
        public DateTime Date { get; set; }
        public decimal Amount { get; set; }
    }
}

對於大文件,請使用以下內容:

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

namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XmlReader reader = XmlReader.Create(FILENAME);
            List<Data> data = new List<Data>();
            while (!reader.EOF)
            {
                if (reader.Name != "Data")
                {
                    reader.ReadToFollowing("Data");
                }
                if (!reader.EOF)
                {
                    XElement xData = (XElement)XElement.ReadFrom(reader);
                    Data newData = new Data() { Date = (DateTime)xData.Element("Date"), Amount = (decimal)xData.Element("Amount") };
                    data.Add(newData);
                }
            }
        }
    }
    public class Data
    {
        public DateTime Date { get; set; }
        public decimal Amount { get; set; }
    }
}

我簡化了你的代碼。 它應該工作。

var serializer = new XmlSerializer(typeof(Obj));

using (XmlReader reader = XmlReader.Create(_xmlPath))
{
    while (reader.ReadToFollowing("Obj"))
    {
        Obj obj = (Obj)serializer.Deserialize(reader);
    }
}

如果實際的 xml 具有更復雜的結構並且此代碼不起作用,請告訴我們。

暫無
暫無

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

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