【问题标题】:Read from xml file to objectlist using Linq使用 Linq 从 xml 文件读取到 objectlist
【发布时间】:2018-11-01 14:34:23
【问题描述】:

我一直在尝试了解如何使用 linq 处理 xml 文件。

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<podcasts>
  <podcast>
    <url>http://...</url>
    <name>blablabla</name>
    <frequency>20 min</frequency>
    <category>Drama</category>
    <episodes>
      <episode>
        <name>blablabla</name>
        <description>blablabla...</description>
      </episode>
      <episode>
        <name>blablabla</name>
        <description>blablabla...</description>
      </episode>
    </episodes>
  </podcast>
  <podcast>
    <url>http://...</url>
    <name>blablabla</name>
    <frequency>20 min</frequency>
    <category>Drama</category>
    <episodes>
      <episode>
        <name>blablabla</name>
        <description>blablabla...</description>
      </episode>
      <episode>
        <name>blablabla</name>
        <description>blablabla...</description>
      </episode>
    </episodes>
  </podcast>
</podcasts>

问题是我可以检索播客信息,但不能检索该播客的剧集。播客列表获取播客信息,但播客对象中的剧集列表没有获取剧集信息。当我调试时它说剧集列表为空..

Podcast 和 Episode 类看起来像这样

public class Podcast
    {
        public string Url { get; set; }
        public string EpisodesQuantity { get; set; }
        public string Name { get; set; }
        public string Frequency { get; set; }
        public string Category { get; set; }
        public List<Episode> episodeList { get; set; }

    }    


public class Episode
    {
        public string Name { get; set; }
        public string Desc { get; set; }
        public string Link { get; set; }
    }

我真的被困在这里,你们知道我做错了什么吗? :(

【问题讨论】:

  • 为什么不直接反序列化 xml? new XmlSerializer(typeof(Podcast[])).Deserialize(xmlReader);
  • @MrObama 你为什么从问题中删除代码?
  • @MrObama 我试图帮助你。如果您删除代码,人们可能会开始反对您的问题。他们会认为你完全没有为解决你的问题付出任何努力。

标签: c# xml linq


【解决方案1】:

这应该是对的。我有类似的东西,只是根据您的需要进行了编辑。我想你会对此有所了解。

episodeList = (from e in p.Element("episodes").Elements("episode")
                    select new Episode
                    {
                        Name = e.Element("name").Value,
                        Desc = e.Element("description").Value
                    }).ToList()

我有代码加载非常复杂的 XML。所以你可以看到逻辑。看看吧。

 public static EdiFile read(XElement xmlDoc)
        {
            return new EdiFile
            {
                SPPLR_MAILBOX = xmlDoc.Element("SPPLR_MAILBOX").Value,
                MESSAGE_ID = xmlDoc.Element("MESSAGE_ID").Value,
                ASN_NO = xmlDoc.Element("ASN_NO").Value,
                MESSAGE_SEND_DATE = xmlDoc.Element("MESSAGE_SEND_DATE").Value,
                ETD = xmlDoc.Element("ETD").Value,
                ETA = xmlDoc.Element("ETA").Value,
                INVOICE_NUM = xmlDoc.Element("INVOICE_NUM").Value,
                SPPLR_CD = xmlDoc.Element("SPPLR_CD").Value,
                SPPLR_CONTACT = xmlDoc.Element("SPPLR_CONTACT").Value,
                DELIVERY_PARTY_CD = xmlDoc.Element("DELIVERY_PARTY_CD").Value,
                DELIVERY_TO_PLACE = xmlDoc.Element("DELIVERY_TO_PLACE").Value,
                DELIVERY_FROM_PLACE = xmlDoc.Element("DELIVERY_FROM_PLACE").Value,
                SHIPPING_TYPE = xmlDoc.Element("SHIPPING_TYPE").Value,
                FREIGHT_TERMS = xmlDoc.Element("FREIGHT_TERMS").Value,
                TRUCK_CONTACT = xmlDoc.Element("TRUCK_CONTACT").Value,
                TRUCK_LICENCE_NUM = xmlDoc.Element("TRUCK_LICENCE_NUM").Value,
                CREATED_BY = xmlDoc.Element("CREATED_BY").Value,
                CREATED_DATE = xmlDoc.Element("CREATED_DATE").Value,
                ATTRIBUTE01 = xmlDoc.Element("ATTRIBUTE01").Value,
                ATTRIBUTE02 = xmlDoc.Element("ATTRIBUTE02").Value,
                ATTRIBUTE03 = xmlDoc.Element("ATTRIBUTE03").Value,
                ATTRIBUTE04 = xmlDoc.Element("ATTRIBUTE04").Value,
                ATTRIBUTE05 = xmlDoc.Element("ATTRIBUTE05").Value,
                Levels0 = (from a in xmlDoc.Element("LEVELS0").Elements("LEVEL0")
                           select new Level0
                           {
                               PLT_NUM = a.Element("PLT_NUM").Value,
                               PLT_LABEL_ID = a.Element("PLT_LABEL_ID").Value,
                               BOX_COUNT = a.Element("BOX_QTY").Value,
                               PLT_WEIGHT = a.Element("PLT_WEIGTH").Value,
                               PLT_DIMENSION = a.Element("PLT_DIMENSION").Value,
                               PLT_CHEM = a.Element("PLT_CHEM").Value,
                               PLT_NOT_STACK = a.Element("PLT_NOT_STACK").Value,
                               PLT_NOTE = a.Element("PLT_NOTE").Value,
                               ATTRIBUTE01 = a.Element("ATTRIBUTE01").Value,
                               ATTRIBUTE02 = a.Element("ATTRIBUTE02").Value,
                               ATTRIBUTE03 = a.Element("ATTRIBUTE03").Value,
                               ATTRIBUTE04 = a.Element("ATTRIBUTE04").Value,
                               ATTRIBUTE05 = a.Element("ATTRIBUTE05").Value,
                               Levels1 = (from b in a.Element("LEVELS1").Elements("LEVEL1")
                                          select new Level1
                                          {
                                              BOX_NUM = b.Element("BOX_NUM").Value,
                                              BOX_LABEL_ID = b.Element("BOX_LABEL_ID").Value,
                                              Items = (from c in b.Element("ITEMS").Elements("ITEM")
                                                       select new Item
                                                       {
                                                           SPPLR_ITEM = c.Element("SPPLR_ITEM").Value,
                                                           CUST_ITEM = c.Element("CUST_ITEM").Value,
                                                           PO_NO = c.Element("PO_NO").Value,
                                                           PO_REF = c.Element("PO_REF").Value,
                                                           COUNTRY_OF_ORIGIN = c.Element("COUNTRY_OF_ORIGIN").Value,
                                                           BATCH_NO = c.Element("BATCH_NO").Value,
                                                           MLS_CLASS = c.Element("MLS_CLASS").Value,
                                                           ATTRIBUTE01 = c.Element("ATTRIBUTE01").Value,
                                                           ATTRIBUTE02 = c.Element("ATTRIBUTE02").Value,
                                                           ATTRIBUTE03 = c.Element("ATTRIBUTE03").Value,
                                                           ATTRIBUTE04 = c.Element("ATTRIBUTE04").Value,
                                                           ATTRIBUTE05 = c.Element("ATTRIBUTE05").Value,
                                                           Lots = (from d in c.Element("LOTS").Elements("LOT")
                                                                   select new Lot
                                                                   {
                                                                       LOT_NUM = d.Element("LOT_NUM").Value,
                                                                       LOT_LABEL_ID = d.Element("LOT_LABEL_ID").Value,
                                                                       LOT_NOTE = d.Element("LOT_NOTE").Value,
                                                                       LOT_EXP_DATE = d.Element("LOT_EXP_DATE").Value,
                                                                       QTY = d.Element("QTY").Value,
                                                                       UOM = d.Element("UOM").Value,
                                                                       ATTRIBUTE01 = d.Element("ATTRIBUTE01").Value,
                                                                       ATTRIBUTE02 = d.Element("ATTRIBUTE02").Value,
                                                                       ATTRIBUTE03 = d.Element("ATTRIBUTE03").Value,
                                                                       ATTRIBUTE04 = d.Element("ATTRIBUTE04").Value,
                                                                       ATTRIBUTE05 = d.Element("ATTRIBUTE05").Value
                                                                   }).ToList()
                                                       }).ToList()
                                          }).ToList()
                           }).ToList()
            };
        }

如果您是古玩,您可以在我的示例中清楚地看到它是如何工作的。

【讨论】:

  • 这里为什么需要from..in?它不起作用,因为没有名称为 desription 的元素
  • 您的代码可能会抛出NullReferenceException - 它应该是Desc = e.Element("description").Value,而不是Desc = e.Element("desription").Value
  • @RuiJarimba ye,对不起,我看到了,我没有注意到描述错字,我只是复制他的部分并编辑它,我的错。
  • @RomanMarusyk 而 from...in,由于代码清除,我喜欢使用它。你可以更好地适应结构(对我来说)
【解决方案2】:

使用这个

episodeList = p.Element("episodes").Elements("episode")
    .Select(e => new Episode
    {
        Name = e.Element("name").Value,
        Desc = e.Element("description").Value
    }).ToList()

请注意,您在这里有一个错字e.Element("desription")(应该是“描述”)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-09
    • 1970-01-01
    相关资源
    最近更新 更多