如何读取结构未知的XML

我正在为学校作业编写XML查看器,但我不知道如何在不知道文件结构的情况下加载XML文件。
在我读完文件后,我会在列表框中显示XML结构。

这是学校作业,这应该是结果: XML查看器

我有一个示例文件,我可以完美加载,但我坚持随机文件。

XmlDocument doc = new XmlDocument(); using(XmlReader xmlReader = XmlReader.Create("c:\\temp\\sites.xml")) { //Load file doc.Load(xmlReader); XmlNode root = doc.DocumentElement; foreach (XmlNode siteNode in root) { //Nodes XmlNode URLNode = siteNode.FirstChild; XmlNode EmailNode = siteNode.LastChild; //Create site Site site = new Site(URLNode.FirstChild.Value, EmailNode.FirstChild.Value); //Add to list sites.Add(site); } Console.WriteLine(sites.Count); } 

在不知道结构的情况下,您无法将XML数据转换为已知类(如Site )类,因为您需要某种方法将数据迁移到类构造函数参数/ properties / etc.

话虽这么说,如果你只是想查看或检查XML文件本身,你可以递归检查根元素内的XmlNode元素。

XmlNode包含您需要执行此操作的所有属性,例如ChildNodes , Attributes和Value 。

不确定用例,但在编写一个小型作业调度程序时,我将每个作业表示为一组3项内容 – 一个调度程序,一个实现特定作业的完全限定类名,一些文本作业上下文(XML)。 当调度程序需要在预定时间执行作业时,在使用reflection和程序集的已知位置创建作业类时,它将XML上下文传递给作业构造函数,该构造函数知道如何处理它。

同样,如果您可以在XML中定义一个类,那么您可以先读取它并采取相应的行动。

如果它只是一个查看器,为什么不将XML加载到DataSet或DataTable中,然后将其绑定到DataGrid

如果我是你,我会尝试使用LINQ to XML,重点放在XElement提供的function上 – 它更友好,更容易使用。 我还建议您使用递归(如Reed Copsey建议的那样)来遍历XML。