LINQ-to-XML中的C#反序列化 [英] C# Deserialization in LINQ-to-XML

查看:72
本文介绍了LINQ-to-XML中的C#反序列化的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个具有以下结构的XML文件:

I have an XML file with the following structure:

<?xml version="1.0" encoding="utf-8"?>
<root>
  <MIRs>
    <MIR id="1" number="1" revision="0">
      <issue_data>
        <issue_date>28-9-2018</issue_date>
        <from>Foo</from>
        <to>Foo</to>
        <author>Foo</author>
        <attn>Foo</attn>
        <field>Foo</field>
        <material_group>Foo</material_group>
        <related_sub>Foo</related_sub>
      </issue_data>
      <reply_data>
        <reply_date></reply_date>
        <action_code></action_code>
        <reply_from />
      </reply_data>
      <receive_data>
        <receive_date />
        <receive_by />
      </receive_data>
      <items>
        <item>
          <serial>1</serial>
          <boq_code>Foo-01</boq_code>
          <item_details>Foo</item_details>
          <model />
          <manufacturer>Foo</manufacturer>
          <size>1"</size>
          <uom>mt</uom>
          <qty>240</qty>
          <approval>Approved</approval>
          <approved_qty>240</approved_qty>
          <is_lumbsum>false</is_lumbsum>
        </item>
      </items>
      <submission_data>
        <submitted>false</submitted>
        <status>1</status>
      </submission_data>
    </MIR>

  </MIRs>
</root>

在我的项目中,我有以下代码:

In my project I have this code:

var x =
            (from mir in XmlFiles.MIR.Root.Descendants("MIR")
             select new
             {
                 Number = mir.Attribute("number").Value,
                 Revision = mir.Attribute("revision").Value,
                 From = mir.Element("issue_data").Element("from").Value,
                 Material = mir.Element("issue_data").Element("material_group").Value,
                 Field = mir.Element("issue_data").Element("field").Value,
                 Submittal = mir.Element("issue_data").Element("related_sub").Value,
                 To = mir.Element("issue_data").Element("to").Value,
                 Atten = mir.Element("issue_data").Element("attn").Value,
                 IssueDate = Convert.ToDateTime(mir.Element("issue_data").Element("issue_date").Value),
                 ReplyDate = mir.Element("reply_data").Element("reply_date").Value,
                 ActionCode = mir.Element("reply_data").Element("action_code").Value,
                 Author = mir.Element("issue_data").Element("author").Value,
                 IsSubmitted = Convert.ToBoolean(mir.Element("submission_data").Element("submitted").Value),
                 Status = mir.Element("submission_data").Element("status").Value
             }).First();

我想做的就是用这样的LINQ-to-Entities风格编写代码

What I trying to do is to write the code in a LINQ-to-Entities style like this

Number = mir.Attribute("number").Value

Number = mir.Attribute("number").Value

要像这样:

Number = mir.Number

Number = mir.Number

Revision = mir.Revision

Revision = mir.Revision

发件人= mir.IssueData.From

From = mir.IssueData.From

Material = mir.IssueData.MaterialGroup

Material = mir.IssueData.MaterialGroup

等等,在其余的代码中,我搜索并阅读了有关反序列化的信息,以及如何进行反序列化,并添加了对象(类),但是我不知道如何在我的代码中使用它们(假设在Linq-to中是可能的) -XML

and so on the rest of the code, I searched and read about deserialization and how to do it andadded my objects (classes) but I don't know how to use them in my code assuming it is possible in Linq-to-XML

反序列化的代码为:

using System;
using System.Xml.Serialization;
using System.Collections.Generic;

namespace SDM
{
    [XmlRoot(ElementName = "issue_data")]
    public class IssueData
    {
        [XmlElement(ElementName = "issue_date")]
        public string IssueDate { get; set; }

        [XmlElement(ElementName = "from")]
        public string From { get; set; }

        [XmlElement(ElementName = "to")]
        public string To { get; set; }

        [XmlElement(ElementName = "author")]
        public string Author { get; set; }

        [XmlElement(ElementName = "attn")]
        public string Attn { get; set; }

        [XmlElement(ElementName = "field")]
        public string Field { get; set; }

        [XmlElement(ElementName = "material_group")]
        public string MaterialGroup { get; set; }

        [XmlElement(ElementName = "related_sub")]
        public string RelatedSub { get; set; }
    }

    [XmlRoot(ElementName = "reply_data")]
    public class ReplyData
    {
        [XmlElement(ElementName = "reply_date")]
        public string ReplyDate { get; set; }

        [XmlElement(ElementName = "action_code")]
        public string ActionCode { get; set; }

        [XmlElement(ElementName = "reply_from")]
        public string ReplyFrom { get; set; }
    }

    [XmlRoot(ElementName = "receive_data")]
    public class ReceiveData
    {
        [XmlElement(ElementName = "receive_date")]
        public string ReceiveDate { get; set; }

        [XmlElement(ElementName = "receive_by")]
        public string ReceiveBy { get; set; }
    }

    [XmlRoot(ElementName = "item")]
    public class Item
    {
        [XmlElement(ElementName = "serial")]
        public string Serial { get; set; }

        [XmlElement(ElementName = "boq_code")]
        public string BoqCode { get; set; }

        [XmlElement(ElementName = "item_details")]
        public string ItemDetails { get; set; }

        [XmlElement(ElementName = "model")]
        public string Model { get; set; }

        [XmlElement(ElementName = "manufacturer")]
        public string Manufacturer { get; set; }

        [XmlElement(ElementName = "size")]
        public string Size { get; set; }

        [XmlElement(ElementName = "uom")]
        public string UoM { get; set; }

        [XmlElement(ElementName = "qty")]
        public string Quantity { get; set; }

        [XmlElement(ElementName = "approval")]
        public string Approval { get; set; }

        [XmlElement(ElementName = "approved_qty")]
        public string ApprovedQuantity { get; set; }

        [XmlElement(ElementName = "is_lumbsum")]
        public string IsLumbsum { get; set; }
    }

    [XmlRoot(ElementName = "items")]
    public class Items
    {
        [XmlElement(ElementName = "item")]
        public Item Item { get; set; }
    }

    [XmlRoot(ElementName = "submission_data")]
    public class SubmissionData
    {
        [XmlElement(ElementName = "submitted")]
        public string Submitted { get; set; }

        [XmlElement(ElementName = "status")]
        public string Status { get; set; }
    }

    [XmlRoot(ElementName = "MIR")]
    public class MIR
    {
        [XmlElement(ElementName = "issue_data")]
        public IssueData IssueData { get; set; }

        [XmlElement(ElementName = "reply_data")]
        public ReplyData ReplyData { get; set; }

        [XmlElement(ElementName = "receive_data")]
        public ReceiveData ReceiveData { get; set; }

        [XmlElement(ElementName = "items")]
        public Items Items { get; set; }

        [XmlElement(ElementName = "submission_data")]
        public SubmissionData SubmissionData { get; set; }

        [XmlAttribute(AttributeName = "id")]
        public string ID { get; set; }

        [XmlAttribute(AttributeName = "number")]
        public string Number { get; set; }

        [XmlAttribute(AttributeName = "revision")]
        public string Revision { get; set; }
    }

    [XmlRoot(ElementName = "MIRs")]
    public class MIRs
    {
        [XmlElement(ElementName = "MIR")]
        public MIR MIR { get; set; }
    }

    [XmlRoot(ElementName = "root")]
    public class Root
    {
        [XmlElement(ElementName = "MIRs")]
        public MIRs MIRs { get; set; }
    }

}

推荐答案

由于MIR是MIR的集合,因此您应将Root clsss修改为-

As MIRs is collection of MIR, then you should modify the Root clsss as -

[XmlRoot(ElementName = "root")]
public class Root
{
    [XmlArray(ElementName = "MIRs")]
    public List<MIR> MIRs { get; set; }
}

您不需要MIRs类,因此删除该类.

You don't need the MIRs class, so delete that one.

现在,您可以使用XmlSerializer将xmldata反序列化为实体,如下所示.

Now you can Deserialize the xmldata to entity using XmlSerializer like below.

XmlSerializer serializer = new XmlSerializer(typeof(Root));
Root root;
using (TextReader reader = new StringReader(xmlData))
{
    root = (Root)serializer.Deserialize(reader);
}

现在,您可以像下面这样在实体上编写LINQ查询-

Now you can write LINQ queries on the entity like below -

// Linq queries
root.MIRs.Select(mir => new {
    Number = mir.Number,
    Revesion = mir.Revision
}).FirstOrDefault();

如果要从文件读取XML数据,则应使用FileStrem而不是TextReader.

if you are reading the XML data from file, then you should FileStrem instead of TextReader.

using (FileStream fileStream = new FileStream("FilePath", FileMode.Open))
{
    root = (Root)serializer.Deserialize(fileStream);
}

这篇关于LINQ-to-XML中的C#反序列化的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆