如何在c#中使用Linq到Xml的几个级别

本文关键字:几个 Xml Linq | 更新日期: 2023-09-27 18:13:12

所以我在"root"元素中创建了一个具有多个级别的xml。基本上是这样的:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<Collectibles>
  <SaveAltars>
    <SaveAltar>
      <Location>
        <row>0</row>
        <col>1</col>
      </Location>
      <Quantity>1</Quantity>
      <Collected />
    </SaveAltar>
    <SaveAltar>
      <Location>
        <row>0</row>
        <col>3</col>
      </Location>
      <Quantity>1</Quantity>
      <Collected />
    </SaveAltar>
  <Fruits>
    <Fruit>
      <Location>
        <row>0</row>
        <col>1</col>
      </Location>
      <Quantity>7</Quantity>
      <Collected />
    </Fruit>
    <Fruit>
      <Location>
        <row>0</row>
        <col>4</col>
      </Location>
      <Quantity>4</Quantity>
      <Collected />
    </Fruit>
  </Fruits>
  <Lizards>
    <Lizard>
      <Location>
        <row>0</row>
        <col>1</col>
      </Location>
      <Quantity>1</Quantity>
      <Collected />
    </Lizard>
    <Lizard>
      <Location>
        <row>0</row>
        <col>3</col>
      </Location>
      <Quantity>1</Quantity>
      <Collected />
  </Lizards>
</Collectibles>

我也有简单的类,像这样:

class Fruit
{
    public string Col;
    public string Row;
    public string Quantity;
    public string Collected;
}

并且我愿意使用linQ to Xml制作水果/蜥蜴/savealars的列表,但我不知道你必须继续阅读每个级别的收藏品列表。比如阅读一个Fruit,然后将其保存到一个类中,并将其放入列表中。

我该怎么做呢?

现在我试着像

    XDocument collectXml = XDocument.Load("collect.xml");
    foreach (XElement elem in collectXml.Descendants("Collectibles").Descendants("SaveAltars"))
    {
        MessageBox.Show(elem.Descendants("Location").Descendants("row").ToString());
    }

但是它显示了一些随机代码,我不知道如何填充类并将其保存在xml文件中的每个元素的列表中:/

你能帮帮我吗?

如何在c#中使用Linq到Xml的几个级别

听起来你想要这样做:

var fruit = collectXml
    .Descendants("Fruit")
    .Select(x => new Fruit {
        Col = (string) x.Element("Location").Element("Col"),
        Row = (string) x.Element("Location").Element("Row"),
        Quantity = (string) x.Element("Quantity"),
        Collected = x.Element("Collected") == null ? "Yes" : "No"
    })
    .ToList();

正如评论中所指出的那样,您应该真的考虑使用更合适的类型-您可能需要Location类型用于位置(RowColumnint值),Quantityint, Collectedbool。哦,我强烈建议使用属性而不是公共字段。