当我第一次开始用 C# 解析 XML 时,我也有点困惑!.NET 提供了 System.XML.Linq 和 System.XML.Serialization 来帮助我们完成所有困难的事情,而不是尝试自己编写所有内容!
这种方法略有不同,因为我们:
- 将 XML 文档加载到 System.XML.Linq.XDocument 中,
- 将 XDocument 反序列化为我们可以随意使用的 .NET 对象 =]
我希望您不介意,但我稍微调整了您的 XML 示例。尽量避免在元素中使用太多属性,因为它们往往会降低可读性。XML 示例的第一行只是突出显示正在使用的版本。
您应该能够将下面的代码示例复制并粘贴到新的控制台应用程序中,以了解它的工作原理。只需确保您的 XML 文件位于 ..\bin\Debug 文件夹中(否则您需要提供完整的文件路径引用)。
如您所见,在此示例中,您的 XML 元素(Display_Settings、Screen、Name、ScreenTag 和 LocalPosition)都是我们用 XMLElement 属性装饰的类。这些类只有在我们调用 Deserialize() 时会自动填充的公共属性。整洁的!
这同样适用于 X、Y 和 Z 属性。
有很多教程可以比我更好地解释这一点 - 享受吧!=]
XML 示例
<?xml version="1.0"?>
<Settings>
<Display_Settings>
<Screen>
<Name>NameGoesHere</Name>
<ScreenTag>ScreenTagGoesHere</ScreenTag>
<LocalPosition X="12" Y="12" Z="12" />
</Screen>
</Display_Settings>
</Settings>
完整的代码示例
using System;
using System.Xml.Linq;
using System.Xml.Serialization;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
// Create XDocument to represent our XML file
XDocument xdoc = XDocument.Load("XmlFile.xml");
// Create a deserializer and break down our XML into c# objects
XmlSerializer deserializer = new XmlSerializer(typeof(Settings));
// Deserialize into a Settings object
Settings settings = (Settings)deserializer.Deserialize(xdoc.CreateReader());
// Check that we have some display settings
if (null != settings.DisplaySettings)
{
Screen screen = settings.DisplaySettings.Screen;
LocalPosition localPosition = screen.LocalPosition;
// Check to make sure we have a screen tag before using it
if (null != screen.ScreenTag)
{
Console.WriteLine("There is a name: " + screen.ScreenTag);
}
// We can just write our integers to the console, as we will get a document error when we
// try to parse the document if they are not provided!
Console.WriteLine("Position: " + localPosition.X + ", " + localPosition.Y + ", " + localPosition.Z);
}
Console.ReadLine();
}
}
[XmlRoot("Settings")]
public class Settings
{
[XmlElement("Display_Settings")]
public DisplaySettings DisplaySettings { get; set; }
}
public class DisplaySettings
{
[XmlElement("Screen")]
public Screen Screen { get; set; }
}
public class Screen
{
[XmlElement("Name")]
public string Name { get; set; }
[XmlElement("ScreenTag")]
public string ScreenTag { get; set; }
[XmlElement("LocalPosition")]
public LocalPosition LocalPosition { get; set; }
}
public class LocalPosition
{
[XmlAttribute("X")]
public int X { get; set; }
[XmlAttribute("Y")]
public int Y { get; set; }
[XmlAttribute("Z")]
public int Z { get; set; }
}
}