简体   繁体   English

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

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

I tried:我试过了:

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: Xml:

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

Data class:数据 class:

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

Normally, it's a large XML file, this is why I try to cut it to fragments and I use XmlReader to parse it.通常,它是一个大的 XML 文件,这就是为什么我尝试将它切割成碎片并使用 XmlReader 解析它的原因。 The deserialization doesn't work, if you have other ways I'm a taker反序列化不起作用,如果你有其他方式我是一个接受者

Try following:尝试以下操作:

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; }
    }
}

For huge files use following:对于大文件,请使用以下内容:

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; }
    }
}

I simplified your code.我简化了你的代码。 It should work.它应该工作。

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

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

If the actual xml has a more complex structure and this code doesn't work, let us know.如果实际的 xml 具有更复杂的结构并且此代码不起作用,请告诉我们。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何使用XmlWriter将System.Xml.Linq.XElement写入流 - How to write System.Xml.Linq.XElement using XmlWriter to a stream System.Xml.Linq.XElement中的查询元素 - Query elements in System.Xml.Linq.XElement System.Xml.Linq.XElement&#39;不包含&#39;XPathEvaluate的定义 - System.Xml.Linq.XElement' does not contain a definition for 'XPathEvaluate 扩展System.Xml.Linq.XElement-内部CloneNode - Extending System.Xml.Linq.XElement - internal CloneNode VS2010将System.Xml.XmlElement与System.Xml.Linq.XElement混淆? - VS2010 confuses System.Xml.XmlElement with System.Xml.Linq.XElement? Web服务:无法将类型&#39;System.Xml.Linq.XElement&#39;隐式转换为&#39;System.Xml.XmlElement&#39; - Webservices : Cannot implicitly convert type 'System.Xml.Linq.XElement' to 'System.Xml.XmlElement' 将xml字符串传递给System.Xml.Linq.XElement时,避免使用尖括号将xml转义 - Avoid xml escaping of angle brackets, when passing xml string to System.Xml.Linq.XElement Linq强制转换Xelement错误:无法将类型为'System.Xml.Linq.XElement'的对象强制转换为'System.IConvertible' - Linq cast conversion Xelement error: Unable to cast object of type 'System.Xml.Linq.XElement' to type 'System.IConvertible' 对Xdocument的Linq查询返回“System.linq.Enumerable + WhereSelectEnumerableIterator&#39;2 [system.XML.Linq.Xelement,System.String] - Linq query on Xdocument returns "System.linq.Enumerable+WhereSelectEnumerableIterator'2[system.XML.Linq.Xelement,System.String] 数据绑定:“ System.Xml.linq.XElement”不包含名称为“ colorName”的属性 - DataBinding: 'System.Xml.linq.XElement' does not contain a property with the name 'colorName'
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM