从 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。您正在获取属性名称为 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();