【问题标题】:Creating a class from an XML file that can be enumerated through从一个可以枚举的 XML 文件创建一个类
【发布时间】:2013-09-28 19:04:14
【问题描述】:

我尝试使用 xsd.exe 为我的 xml 创建一个类,它似乎可以工作,但我可以枚举该类。我什至尝试使用 Xsd2Code,但这会导致此错误“反映类型 'MySQlXML.XBMC' 时出现错误。”当我试图 枚举列表。如果您对如何使枚举起作用有任何想法,请告诉我。

这是我的 xml

<?xml version="1.0" encoding="utf-8"?>
<XBMC>
  <Show>
    <IdShow>1</IdShow>
    <TheTvDbId>248741</TheTvDbId>
    <ShowName>2 Broke Girls</ShowName>
    <Seasons>
      <Season>
        <Number>1</Number>
        <Path>\\10.0.0.3\tv\2 Broke Girls\Season1\</Path>
      </Season>
      <Season>
        <Number>3</Number>
        <Path>\\10.0.0.3\tv\2 Broke Girls\Season 03\</Path>
      </Season>
    </Seasons>
  </Show>
  <Show>
    <IdShow>164</IdShow>
    <TheTvDbId>75682</TheTvDbId>
    <ShowName>Bones</ShowName>
    <Seasons>
      <Season>
        <Number>1</Number>
        <Path>\\10.0.0.3\TV2\Bones\Season 01\</Path>
      </Season>
    </Seasons>
  </Show>
</XBMC>

这是序列化数据的方式,但是当我尝试 foreach (XBMCShow show in test) 时,我得到 foreach 语句无法对“MySQlXML.XBMC”类型的变量进行操作,因为“MySQlXML.XBMC”不包含“GetEnumerator”的公共定义'

    TextReader reader = new StreamReader(_XMLFile);
    XmlSerializer serializer = new XmlSerializer(typeof(XBMC));
    test = (XBMC)serializer.Deserialize(reader);
    reader.Close(); 

这是类 xsd.exe 生成的。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Serialization;


namespace MySQlXML
{  
    /// <remarks/>
    public partial class XBMC
    {

        private XBMCShow[] showField;

        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("Show")]
        public XBMCShow[] Show
        {
            get
            {
                return this.showField;
            }
            set
            {
                this.showField = value;
            }
        }
    }

    /// <remarks/>

    public partial class XBMCShow
    {

        public ushort idShowField;

        public string theTvDbIdField;

        public string showNameField;

        private XBMCShowSeason[] seasonsField;

        /// <remarks/>
        public ushort IdShow
        {
            get
            {
                return this.idShowField;
            }
            set
            {
                this.idShowField = value;
            }
        }

        /// <remarks/>
        public string TheTvDbId
        {
            get
            {
                return this.theTvDbIdField;
            }
            set
            {
                this.theTvDbIdField = value;
            }
        }

        /// <remarks/>
        public string ShowName
        {
            get
            {
                return this.showNameField;
            }
            set
            {
                this.showNameField = value;
            }
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlArrayItemAttribute("Season", IsNullable = false)]
        public XBMCShowSeason[] Seasons
        {
            get
            {
                return this.seasonsField;
            }
            set
            {
                this.seasonsField = value;
            }
        }
    }

    /// <remarks/>

    public partial class XBMCShowSeason
    {

        private byte numberField;

        private string pathField;

        /// <remarks/>
        public byte Number
        {
            get
            {
                return this.numberField;
            }
            set
            {
                this.numberField = value;
            }
        }

        /// <remarks/>
        public string Path
        {
            get
            {
                return this.pathField;
            }
            set
            {
                this.pathField = value;
            }
        }
    }

}

【问题讨论】:

    标签: c# .net xml c#-4.0


    【解决方案1】:

    尝试:

    foreach (XBMCShow show in test.Show) {
                                   ----
                                     ^
    
         if(show.ShowName == "Bones") {
             ...
    

    你错过了点显示部分

    【讨论】:

    • 好的,谢谢,最后一件事我如何从数组中选择“Bones”节目,例如
    • 很酷,如果我想在不循环整个数组的情况下做同样的事情,你可以使用数组索引,但这不是一个选项,听到想要这样的东西test.Show[].ShowName == "Bones"
    • 您可以使用 LINQ。但是要搜索集合中的项目,您无论如何都需要迭代。您可以在 for/while 循环中执行此操作,或者让 LINQ 执行此操作。某处或其他地方会出现一个循环。
    猜你喜欢
    • 1970-01-01
    • 2019-10-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-14
    • 1970-01-01
    • 1970-01-01
    • 2012-04-18
    • 1970-01-01
    相关资源
    最近更新 更多