【问题标题】:C# Parsing XML to Lists returns empty listsC# 将 XML 解析为列表返回空列表
【发布时间】:2020-02-04 22:18:50
【问题描述】:

我有问题。我从我的网页收到以下 XML:

<data>
  <sets>
    <set>
      <name>Set A</name>
      <price>7.5</price>
      <pictures>
        <picture>
          <id>5</id>
          <name>Potret2Pasfoto.jpg</name>
          <size>1X 13X18 + 1X 10X15 + 6 pasfotos op 20X30,5</size>
          <price>7.50</price>
          <quantity>1</quantity>
        </picture>
      </pictures>
    </set>
    <set>
      <name>Set B</name>
      <price>14.45</price>
      <pictures>
        <picture>
          <id>4</id>
          <name>Potret2.jpg</name>
          <size>13 x 18 mat</size>
          <price>6.95</price>
          <quantity>1</quantity>
        </picture>
        <picture>
          <id>5</id>
          <name>Potret2Pasfoto.jpg</name>
          <size>1X 13X18 + 1X 10X15 + 6 pasfotos op 20X30,5</size>
          <price>7.50</price>
          <quantity>1</quantity>
        </picture>
      </pictures>
    </set>
    <set>
      <name>Set C</name>
      <price>13.9</price>
      <pictures>
        <picture>
          <id>4</id>
          <name>Potret2.jpg</name>
          <size>13 x 18 mat</size>
          <price>6.95</price>
          <quantity>2</quantity>
        </picture>
        <picture>
          <id>5</id>
          <name>Potret2Pasfoto.jpg</name>
          <size>13 x 18 mat</size>
          <price>6.95</price>
          <quantity>1</quantity>
        </picture>
      </pictures>
    </set>
    <set>
      <name>Set D</name>
      <price>14.45</price>
      <pictures>
        <picture>
          <id>1</id>
          <name>GroepsFoto.jpg</name>
          <size>Groepsfoto 13 x 18 mat</size>
          <price>6.95</price>
          <quantity>1</quantity>
        </picture>
        <picture>
          <id>5</id>
          <name>Potret2Pasfoto.jpg</name>
          <size>1X 13X18 + 1X 10X15 + 6 pasfotos op 20X30,5</size>
          <price>7.50</price>
          <quantity>1</quantity>
        </picture>
      </pictures>
    </set>
    <set>
      <name>Set E</name>
      <price>21.4</price>
      <pictures>
        <picture>
          <id>1</id>
          <name>GroepsFoto.jpg</name>
          <size>Groepsfoto 13 x 18 mat</size>
          <price>6.95</price>
          <quantity>1</quantity>
        </picture>
        <picture>
          <id>4</id>
          <name>Potret2.jpg</name>
          <size>13 x 18 mat</size>
          <price>6.95</price>
          <quantity>1</quantity>
        </picture>
        <picture>
          <id>5</id>
          <name>Potret2Pasfoto.jpg</name>
          <size>1X 13X18 + 1X 10X15 + 6 pasfotos op 20X30,5</size>
          <price>7.50</price>
          <quantity>1</quantity>
        </picture>
      </pictures>
    </set>
    <set>
      <name>Set F</name>
      <price>21.4</price>
      <pictures>
        <picture>
          <id>1</id>
          <name>GroepsFoto.jpg</name>
          <size>Groepsfoto 13 x 18 mat</size>
          <price>6.95</price>
          <quantity>1</quantity>
        </picture>
        <picture>
          <id>4</id>
          <name>Potret2.jpg</name>
          <size>13 x 18 mat</size>
          <price>6.95</price>
          <quantity>2</quantity>
        </picture>
        <picture>
          <id>5</id>
          <name>Potret2Pasfoto.jpg</name>
          <size>1X 13X18 + 1X 10X15 + 6 pasfotos op 20X30,5</size>
          <price>7.50</price>
          <quantity>1</quantity>
        </picture>
      </pictures>
    </set>
  </sets>
  <pictures>
    <picture>
      <id>5</id>
      <name>Potret2Pasfoto.jpg</name>
      <sizes>
        <size>
          <id>1</id>
          <name>1X 13X18 + 1X 10X15 + 6 pasfotos op 20X30,5</name>
          <price>7.50</price>
        </size>
      </sizes>
    </picture>
    <picture>
      <id>4</id>
      <name>Potret2.jpg</name>
      <sizes>
        <size>
          <id>2</id>
          <name>13 x 18 mat</name>
          <price>6.95</price>
        </size>
        <size>
          <id>4</id>
          <name>10 x 15 mat</name>
          <price>6.50</price>
        </size>
        <size>
          <id>13</id>
          <name>20 x 28 mat</name>
          <price>9.75</price>
        </size>
        <size>
          <id>14</id>
          <name>30 x 45 mat</name>
          <price>25.00</price>
        </size>
        <size>
          <id>15</id>
          <name>40 x 60 mat</name>
          <price>45.00</price>
        </size>
        <size>
          <id>16</id>
          <name>50 x 70 mat</name>
          <price>57.50</price>
        </size>
        <size>
          <id>17</id>
          <name>canvas+opspannen 20 x 28</name>
          <price>32.50</price>
        </size>
        <size>
          <id>18</id>
          <name>canvas+opspannen 30 x 45</name>
          <price>42.50</price>
        </size>
        <size>
          <id>19</id>
          <name>canvas+opspannen 40 x 60</name>
          <price>59.50</price>
        </size>
        <size>
          <id>20</id>
          <name>canvas+opspannen 50 x 70</name>
          <price>72.50</price>
        </size>
        <size>
          <id>21</id>
          <name>canvas+opspannen 60 x 80</name>
          <price>85.00</price>
        </size>
        <size>
          <id>22</id>
          <name>canvas+opspannen 70 x 100</name>
          <price>99.00</price>
        </size>
      </sizes>
    </picture>
    <picture>
      <id>1</id>
      <name>GroepsFoto.jpg</name>
      <sizes>
        <size>
          <id>2</id>
          <name>13 x 18 mat</name>
          <price>6.95</price>
        </size>
        <size>
          <id>4</id>
          <name>10 x 15 mat</name>
          <price>6.50</price>
        </size>
        <size>
          <id>13</id>
          <name>20 x 28 mat</name>
          <price>9.75</price>
        </size>
        <size>
          <id>14</id>
          <name>30 x 45 mat</name>
          <price>25.00</price>
        </size>
        <size>
          <id>15</id>
          <name>40 x 60 mat</name>
          <price>45.00</price>
        </size>
        <size>
          <id>16</id>
          <name>50 x 70 mat</name>
          <price>57.50</price>
        </size>
        <size>
          <id>17</id>
          <name>canvas+opspannen 20 x 28</name>
          <price>32.50</price>
        </size>
        <size>
          <id>18</id>
          <name>canvas+opspannen 30 x 45</name>
          <price>42.50</price>
        </size>
        <size>
          <id>19</id>
          <name>canvas+opspannen 40 x 60</name>
          <price>59.50</price>
        </size>
        <size>
          <id>20</id>
          <name>canvas+opspannen 50 x 70</name>
          <price>72.50</price>
        </size>
        <size>
          <id>21</id>
          <name>canvas+opspannen 60 x 80</name>
          <price>85.00</price>
        </size>
        <size>
          <id>22</id>
          <name>canvas+opspannen 70 x 100</name>
          <price>99.00</price>
        </size>
      </sizes>
    </picture>
  </pictures>
</data>

所以我创建了一个用于将 XML 解析为的类。这是我制作的课程:

[XmlRoot("data")]
public class MyData
{
    [XmlArray("sets")]
    [XmlArrayItem("set")]
    public List<set> Sets { get; } = new List<set>();

    [XmlArray("pictures")]
    [XmlArrayItem("picture")]
    public List<SinglePicture> Fotos { get; } = new List<SinglePicture>();
}

public class set
{
    [XmlArray("pictures")]
    [XmlArrayItem("picture")]
    public List<PictureInSet> pictures { get; set; } = new List<PictureInSet>();
    public string name { get; set; }
    public float price { get; set; }
}

public class PictureInSet
{
    public int id { get; set; }
    public string name { get; set; }
    public string size { get; set; }
    public float price { get; set; }
    public int quantity { get; set; }
}

public class SinglePicture
{
    public int id { get; set; }
    public string name { get; set; }
    [XmlArray("sizes")]
    [XmlArrayItem("size")]
    public List<size> sizes { get; set; } = new List<size>();
}

public class size
{
    public int id { get; set; }
    public string name { get; set; }
    public float price { get; set; }
}

但是当我尝试使用以下代码解析它时:

var xmlString = await response.Content.ReadAsStringAsync();

var ser = new XmlSerializer(typeof(MyData));
var data = (MyData)ser.Deserialize(new StringReader(xmlString));

App.lstSets = data.Sets;
App.lstPictures = data.Pictures;

两个列表都是空的。我用特殊粘贴制作了这个类,但更改了一些不必要的粘贴内容。

我做错了什么?

【问题讨论】:

  • 查看 XmlArrayItem (docs.microsoft.com/en-us/dotnet/api/…) 的文档,那里的示例都明确指定了进入集合的对象的类型。你试过这个:[XmlArrayItem (typeof(PictureInSet), ElementName = "picture")]
  • 试过了,还是不行?

标签: c# xml parsing


【解决方案1】:

对于你正在使用的xml,这些是你需要使用的类,

    [XmlRoot(ElementName = "picture")]
        public class Picture
        {
            [XmlElement(ElementName = "id")]
            public string Id { get; set; }
            [XmlElement(ElementName = "name")]
            public string Name { get; set; }
            [XmlElement(ElementName = "size")]
            public string Size { get; set; }
            [XmlElement(ElementName = "price")]
            public string Price { get; set; }
            [XmlElement(ElementName = "quantity")]
            public string Quantity { get; set; }
            [XmlElement(ElementName = "sizes")]
            public Sizes Sizes { get; set; }
        }

        [XmlRoot(ElementName = "pictures")]
        public class Pictures
        {
            [XmlElement(ElementName = "picture")]
            public List<Picture> Picture { get; set; }
        }

        [XmlRoot(ElementName = "set")]
        public class Set
        {
            [XmlElement(ElementName = "name")]
            public string Name { get; set; }
            [XmlElement(ElementName = "price")]
            public string Price { get; set; }
            [XmlElement(ElementName = "pictures")]
            public Pictures Pictures { get; set; }
        }

        [XmlRoot(ElementName = "sets")]
        public class Sets
        {
            [XmlElement(ElementName = "set")]
            public List<Set> Set { get; set; }
        }

        [XmlRoot(ElementName = "size")]
        public class Size
        {
            [XmlElement(ElementName = "id")]
            public string Id { get; set; }
            [XmlElement(ElementName = "name")]
            public string Name { get; set; }
            [XmlElement(ElementName = "price")]
            public string Price { get; set; }
        }

        [XmlRoot(ElementName = "sizes")]
        public class Sizes
        {
            [XmlElement(ElementName = "size")]
            public List<Size> Size { get; set; }
        }

        [XmlRoot(ElementName = "data")]
        public class Data
        {
            [XmlElement(ElementName = "sets")]
            public Sets Sets { get; set; }
            [XmlElement(ElementName = "pictures")]
            public Pictures Pictures { get; set; }
        }

并使用以下内容进行反序列化

var ser = new XmlSerializer(typeof(Data));
var data = (Data)ser.Deserialize(new StringReader(xmlString));

List<Set> lstSets = data.Sets.Set;
List<Picture> lstPictures = data.Pictures.Picture;

如果您不确定 C# 中的类及其结构,请使用 xml2CSharp 站点生成带有元素标签的类。

【讨论】:

  • 好的,但是同一类型的更多项目呢,因为我在您的班级中看不到任何列表。我将完整的 XML 添加到我的问题中!?
  • @A.Vreeswijk 用工作代码更新了我的帖子以查找集合列表或图片列表...您必须看到差异,图片是具有图片列表的元素。跨度>
  • 它给了我以下错误:System.InvalidOperationException: There is an error in XML document. ---&gt; System.InvalidOperationException: &lt;data xmlns=''&gt; was not expected at System.Xml.Serialization.XmlSerializationReaderInterpreter.ReadRoot (System.Xml.Serialization.XmlTypeMapping rootMap) [0x0004f] in /Users/builder/jenkins/workspace/archive-mono/2019-08/android/release/mcs/class/System.XML/System.Xml.Serialization/XmlSerializationReaderInterpreter.cs:182.....` 出了什么问题?
  • 我在您上面发布的 xml 中没有看到任何命名空间标签。不确定您正在使用什么 xml,但您发布的那个可以使用此代码。
  • 使用调试器查看 xml 的值以及它在哪一行引发错误。
猜你喜欢
  • 1970-01-01
  • 2014-12-25
  • 2017-04-28
  • 2018-08-12
  • 1970-01-01
  • 2015-04-13
  • 2017-11-07
  • 2017-04-01
  • 1970-01-01
相关资源
最近更新 更多