如何从此 xml 文档中提取数据

How to extract the data from this xml document

我想从每个行星和小行星(不在本例中)提取数据并将其放入字符串列表中。 所以一个行星列表将包含(按顺序):

我在遍历 xml 时遇到了很多麻烦,而且关于这个 imo 的好教程也不多。

xml:

<galaxy>
  <planet>
    <name>Kobol</name>
    <position>
      <x>45</x>
      <y>310</y>
      <radius>7</radius>
    </position>
    <speed>
      <x>0.3</x>
      <y>-0.6</y>
    </speed>
    <neighbours>
      <planet>Unicron</planet>
      <planet>Koarth</planet>
    </neighbours>
    <color>blue</color>
    <oncollision>blink</oncollision>
  </planet>
  <planet>
    <name>Namek</name>
    <position>
      <x>60</x>
      <y>102</y>
      <radius>15</radius>
    </position>
    <speed>
      <x>0.1</x>
      <y>0.2</y>
    </speed>
    <neighbours>
      <planet>Helicon</planet>
      <planet>Synnax</planet>
      <planet>Xenex</planet>
      <planet>Alderaan</planet>
    </neighbours>
    <color>orange</color>
    <oncollision>blink</oncollision>
  </planet>
</galaxy>

有人可以帮忙吗?

你说的是XML反序列化。另一种方式(反对 xml)称为 Serialization

一般来说,在 Whosebug 和 Web 上有很多这两种情况的示例。使用这些字词进行搜索应该会对您有所帮助。

这是来自 Whosebug 的一篇好文章:

How to Deserialize XML document

我们可以通过以下方式定义表示 Xml 的模型:

[XmlRoot("galaxy")]
public class Galaxy
{
    [XmlElement("planet")]
    public List<Planet> Planets { get; set; }
}

public class Planet
{
    [XmlElement("name")]
    public string Name { get; set; }
    
    [XmlElement("position")]
    public Position Position { get; set; }
    
    [XmlElement("speed")]
    public Speed Speed { get; set; }
    
    [XmlElement("neighbours")]
    public List<Neighbour> Neighbours { get; set; }
    
    [XmlElement("color")]
    public string Color { get; set; }
    
    [XmlElement("oncollision")]
    public string OnCollision { get; set; }
}

public class Position
{
    [XmlElement("x")]
    public double X { get; set; }

    [XmlElement("y")]
    public double Y { get; set; }

    [XmlElement("radius")]
    public double Radius { get; set; }
}

public class Speed
{
    [XmlElement("x")]
    public double X { get; set; }

    [XmlElement("y")]
    public double Y { get; set; }
}

public class Neighbour
{
    [XmlElement("planet")]
    public string Name { get; set; }
}

请注意我们如何使用属性来定义 Xml 的布局,并将其映射回对象。

有了这个,我们可以通过以下方式反序列化 Xml:

XmlSerializer serializer = new XmlSerializer(typeof(Galaxy));

using (FileStream stream = new FileStream(filePath, FileMode.Open))
{
    Galaxy galaxy = (Galaxy) serializer.Deserialize(stream);

    foreach (Planet planet in galaxy.Planets)
    {
        Console.WriteLine(planet.Name);
    }
}

输出

Kobol
Namek