从 XML 中读取特定项

本文关键字:读取 XML | 更新日期: 2023-09-27 18:31:36

让我们从我的目标开始。我需要通读一个相当大的 XML 文件,并提取 6 个值。这些值位于我不知道如何访问的子组中的行中。


下面是 XML 结构:

<Project Guid="9e9a67f8" Name="GameThings" Version="1.7">
  <Subsystems>
    <Values Name="Thing1">
      <Values Name="Stuff1" Type="int" Value="0" />
      <Values Name="Stuff2" Type="int" Value="5" />
    </Values>
    <Values Name="Thing2">
      <Values Name="Top" Type="int" Value="10" />
      <Values Name="Bottom" Type="int" Value="15" />
    </Values>
  </Subsystems>
  <OtherSystems>
    <Values Name="Thing3">
      <Values Name="Stuff3" Type="int" Value="0" />
      <Values Name="Stuff4" Type="int" Value="5" />
    </Values>
  </OtherSystems>
</Project>

我在这里尝试做的是从Project-Subsystems-Thing2中检索值。这就是我所需要的。我该怎么做?


这是我尝试过的一件事:

        using (XmlTextReader reader = new XmlTextReader(Path + "Project.xml"))
        {
            while (reader.Read())
            {
                if(reader.)
            }
        }

但它基本上止步于此。这是另一件事,我没有理解,它主要是复制和过去以及我的直觉:

        XmlDocument xml = new XmlDocument();
        xml.LoadXml(Path + "Project.xml");
        XmlNodeList nodes = xml.SelectNodes("/Project[@*]/Subsystems");
        foreach(XmlNode node in nodes)
        {
            if(node["Name"].Value == "GameInfo")
            {
                foreach(XmlNode stuff in node["Name"])
                {
                }
            }
        }

那里也是一样。

从 XML 中读取特定项

下次至少发布有效的 xml。您正在获取属性名称为 Things 的所有值节点,然后从此元素中获取子节点值。

    private static void XDocumentLINQ()
        {
            string xml = @"<?xml version=""1.0"" encoding=""utf-8""?>
<Project Guid=""9e9a67f8"" Name=""GameThings"" Version=""1.7"">
  <Subsystems>
    <Values Name=""Thing1"">
      <Values Name=""Stuff1"" Type=""int"" Value=""0"" />
      <Values Name=""Stuff2"" Type=""int"" Value=""5"" />
    </Values>
    <Values Name=""Thing2"">
      <Values Name=""Top"" Type=""int"" Value=""10"" />
      <Values Name=""Bottom"" Type=""int"" Value=""15"" />
    </Values>
  </Subsystems>
  <OtherSystems>
    <Values Name=""Thing3"">
      <Values Name=""Stuff3"" Type=""int"" Value=""0"" />
      <Values Name=""Stuff4"" Type=""int"" Value=""5"" />
    </Values>
  </OtherSystems>
</Project>";
            XDocument doc = XDocument.Parse(xml);
            var elements = doc.Descendants("Project").Elements("Subsystems").Elements("Values").Where(x=>x.Attribute("Name").Value == "Thing2").Elements("Values");
            foreach (XElement elem in elements)
            {
                Console.WriteLine(elem.Attribute("Name").Value + " value is: " + elem.Attribute("Value").Value);
            }
            Console.ReadKey();
        }

使用 XML 序列化和反序列化,这让事情变得容易得多

XML 的类文件

  /// <remarks/>
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
[System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = false)]
public partial class Project
{
    private ProjectValues[] subsystemsField;
    private ProjectOtherSystems otherSystemsField;
    private string guidField;
    private string nameField;
    private decimal versionField;
    /// <remarks/>
    [System.Xml.Serialization.XmlArrayItemAttribute("Values", IsNullable = false)]
    public ProjectValues[] Subsystems
    {
        get
        {
            return this.subsystemsField;
        }
        set
        {
            this.subsystemsField = value;
        }
    }
    /// <remarks/>
    public ProjectOtherSystems OtherSystems
    {
        get
        {
            return this.otherSystemsField;
        }
        set
        {
            this.otherSystemsField = value;
        }
    }
    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string Guid
    {
        get
        {
            return this.guidField;
        }
        set
        {
            this.guidField = value;
        }
    }
    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string Name
    {
        get
        {
            return this.nameField;
        }
        set
        {
            this.nameField = value;
        }
    }
    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public decimal Version
    {
        get
        {
            return this.versionField;
        }
        set
        {
            this.versionField = value;
        }
    }
}
/// <remarks/>
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public partial class ProjectValues
{
    private ProjectValuesValues[] valuesField;
    private string nameField;
    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("Values")]
    public ProjectValuesValues[] Values
    {
        get
        {
            return this.valuesField;
        }
        set
        {
            this.valuesField = value;
        }
    }
    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string Name
    {
        get
        {
            return this.nameField;
        }
        set
        {
            this.nameField = value;
        }
    }
}
/// <remarks/>
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public partial class ProjectValuesValues
{
    private string nameField;
    private string typeField;
    private byte valueField;
    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string Name
    {
        get
        {
            return this.nameField;
        }
        set
        {
            this.nameField = value;
        }
    }
    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string Type
    {
        get
        {
            return this.typeField;
        }
        set
        {
            this.typeField = value;
        }
    }
    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public byte Value
    {
        get
        {
            return this.valueField;
        }
        set
        {
            this.valueField = value;
        }
    }
}
/// <remarks/>
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public partial class ProjectOtherSystems
{
    private ProjectOtherSystemsValues valuesField;
    /// <remarks/>
    public ProjectOtherSystemsValues Values
    {
        get
        {
            return this.valuesField;
        }
        set
        {
            this.valuesField = value;
        }
    }
}
/// <remarks/>
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public partial class ProjectOtherSystemsValues
{
    private ProjectOtherSystemsValuesValues[] valuesField;
    private string nameField;
    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("Values")]
    public ProjectOtherSystemsValuesValues[] Values
    {
        get
        {
            return this.valuesField;
        }
        set
        {
            this.valuesField = value;
        }
    }
    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string Name
    {
        get
        {
            return this.nameField;
        }
        set
        {
            this.nameField = value;
        }
    }
}
/// <remarks/>
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public partial class ProjectOtherSystemsValuesValues
{
    private string nameField;
    private string typeField;
    private byte valueField;
    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string Name
    {
        get
        {
            return this.nameField;
        }
        set
        {
            this.nameField = value;
        }
    }
    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string Type
    {
        get
        {
            return this.typeField;
        }
        set
        {
            this.typeField = value;
        }
    }
    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public byte Value
    {
        get
        {
            return this.valueField;
        }
        set
        {
            this.valueField = value;
        }
    }
}

法典:

XmlSerializer deserializer = new XmlSerializer(typeof(Project));
        StreamReader reader = new StreamReader(xml);
        object obj = deserializer.Deserialize(reader);
        Project XmlData = (Project)obj;
        reader.Close();
        var val = XmlData.Subsystems.ToList().Where(x=>x.Values.ToList().Select(y=>y.Name).Contains("Thing2")).ToList();