【问题标题】:Reading from XML file从 XML 文件中读取
【发布时间】:2010-06-29 07:44:20
【问题描述】:

我有一个这样的 XML 文件:

<students>
<student rollNo="1" Name ="A" Grade="A"/>
<student rollNo="2" Name ="B" Grade="A"/>
<student rollNo="3" Name ="C" Grade="A"/>
<student rollNo="4" Name ="D" Grade="A"/>
</students>

我需要通过提供 rollNo 从 XML 文件中获取 NameGrade

【问题讨论】:

  • 这不是一个有效的 XML 文件。一个有效的 XML 文件有一个根节点。

标签: c# xml .net-2.0


【解决方案1】:

首先,这不是一个完整的 XML 文件。但是,假设您实际上得到了这样的结果:

<students>
  <student rollNo="1" Name ="A" Grade="A"/>
  <student rollNo="2" Name ="B" Grade="A"/>
  <student rollNo="3" Name ="C" Grade="A"/>
  <student rollNo="4" Name ="D" Grade="A"/>
</students>

你可以使用这样的东西:

XDocument doc = XDocument.Load(filename);
XElement element = doc.Root
                      .Elements("student")
                      .Where(x => (int?) x.Attribute("rollNo") == rollNo);
string name = (string) x.Attribute("Name");
string grade = (string) x.Attribute("Grade");

【讨论】:

  • @chand:已修复。它不会匹配没有 rollNo 属性的元素。
  • 用户代码显示不包含 RootElement 定义的错误
  • @Jon 错误 19 'System.Xml.XmlDocument' 不包含 'Root' 的定义
  • @chand:我的代码不使用 XmlDocument。它使用 XDocument。 LINQ to XML 是比旧 DOM 更好的 API。
  • @chand:下一次,请这样说开始。我现在没有时间编写 .NET 2.0 解决方案。如果我没有在您无法使用的 .NET 3.5 解决方案上浪费时间,我可能已经完成了。
【解决方案2】:

你可以这样写(C# 2):

using System;
using System.Xml;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            string path = @"D:\stack.xml";
            string[] result = ParseXmlFile(path, 2);
        }

        private static string[] ParseXmlFile(string path, int rollNo)
        {
            XmlReaderSettings xtrs = new XmlReaderSettings();
            xtrs.IgnoreComments = true;
            xtrs.IgnoreProcessingInstructions = true;
            xtrs.IgnoreWhitespace = true;

            using (XmlReader xtr = XmlReader.Create(path, xtrs))
            {
                while (xtr.Read())
                {
                    if (xtr.Name == "students")
                    {
                        return ParseStudent(xtr, rollNo);
                    }
                }
            }

            throw new ArgumentException();
        }

        private static string[] ParseStudent(XmlReader reader, int rollNo)
        {
            while (reader.Read())
            {
                if (reader.Name == "student")
                {
                    string _name = string.Empty;
                    string _grade = string.Empty;
                    int _rollNo = 0;

                    while (reader.MoveToNextAttribute())
                    {
                        switch (reader.Name)
                        {
                            case "Name":
                                _name = reader.Value;
                                break;
                            case "Grade":
                                _grade = reader.Value;
                                break;
                            case "rollNo":
                                _rollNo = Convert.ToInt32(reader.Value);
                                break;
                            default:
                                break;
                        }
                    }

                    if (_rollNo == rollNo)
                        return new string[] { _name, _grade };
                }
            }
            throw new ArgumentException();
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-09
    • 1970-01-01
    • 2016-05-19
    • 1970-01-01
    • 2012-03-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多