首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >LINQ-to-XML中的C#反序列化

LINQ-to-XML中的C#反序列化
EN

Stack Overflow用户
提问于 2018-09-28 06:21:44
回答 1查看 67关注 0票数 1

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

代码语言:javascript
复制
<?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>

在我的项目中,我有这样的代码:

代码语言:javascript
复制
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样式编写代码,如下所示

编号=mir.Attribute(“

”).Value

就像这样:

编号= mir.Number

修订= mir.Revision

发件人= mir.IssueData.From

材质= mir.IssueData.MaterialGroup

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

反序列化的代码是:

代码语言:javascript
复制
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; }
    }

}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-28 07:15:01

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

代码语言:javascript
复制
[XmlRoot(ElementName = "root")]
public class Root
{
    [XmlArray(ElementName = "MIRs")]
    public List<MIR> MIRs { get; set; }
}

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

现在可以使用XmlSerializer将can数据反序列化为实体,如下所示。

代码语言:javascript
复制
XmlSerializer serializer = new XmlSerializer(typeof(Root));
Root root;
using (TextReader reader = new StringReader(xmlData))
{
    root = (Root)serializer.Deserialize(reader);
}

现在您可以在实体上编写LINQ查询,如下所示:

代码语言:javascript
复制
// Linq queries
root.MIRs.Select(mir => new {
    Number = mir.Number,
    Revesion = mir.Revision
}).FirstOrDefault();

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

代码语言:javascript
复制
using (FileStream fileStream = new FileStream("FilePath", FileMode.Open))
{
    root = (Root)serializer.Deserialize(fileStream);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52545903

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档