【问题标题】:How to put each XmlElement in XmlNodeList and then read its attributes and its values如何将每个 XmlElement 放入 XmlNodeList 中,然后读取其属性和值
【发布时间】:2016-03-08 19:23:09
【问题描述】:

我正在读取 XML 文件,以便获得创建 Windows 服务所需的所有信息。

问题是,我必须读取 XmlNodeList 中的所有任务,然后迭代到每个 Task 元素并读取属性。

我的 XML 文件如下所示:

<Tasks>  
    <Task name="taskname1" type="tasktype1">   
        <Occurrence starttime="09:00" repeat="01:00" endtime="17:00" />       
        <FreeSpace disk=”C” />  
    </Task>
    <Task name="taskname2" type="tasktype2">   
        <Occurrence startime="11:00" repeat="00:05" endtime="13:00" />       
    </Task> 
</Tasks>

所以我想要的是每个任务都将保存在一个 xmlNodeList 中,然后对于每个任务我必须读取它的子元素属性和它的值。

到目前为止,我所取得的成就是,我只能获得第一个任务的价值,即 C 上的可用空间。

我的代码只是读取第一个任务。

        XmlNodeList xnList = xmlDoc.SelectNodes("/Tasks/Task");
        foreach (XmlNode task in xnList)
        {
            taskName = task.Attributes["name"].Value;//Name
            taskType = task.Attributes["type"].Value;//Type
            Console.WriteLine(taskName + " " + taskType);
        }
        XmlNodeList List = xmlDoc.SelectNodes("/Tasks/Task/Occurrence");
        foreach (XmlNode task1 in List)
        {
            taskStartTime = task1.Attributes["starttime"].Value;//starttime
            taskRepeat = task1.Attributes["repeat"].Value;//rpt
            taskEndTime = task1.Attributes["endtime"].Value;//endtime
            Console.WriteLine(taskStartTime + " " + taskRepeat + " " + taskEndTime);
        }

【问题讨论】:

  • 很抱歉,这并不能回答您的问题,但是使用 Linq to Xml 您正在做的事情会变得非常容易。将您的 Xml 加载到 XDocument 中,然后使用 Linq 查询它以获取所需的 XElement。然后,这些属性只是 XElement 上 XAttribute 对象的集合。
  • @Kevin 我必须在不使用 linq 的情况下这样做
  • 您是否尝试过在第二行停止并调试以查看您最终在列表中完成了多少任务?
  • 我的代码正在读取两个任务的taskNametaskType,以及任务1 的Occurrence。然后它给了我 NullReferenceException。
  • 我了解您的代码正在尝试什么。您的 for 循环看起来不错,所以我怀疑您出于某种原因只在 xnList 中获得了一个 XmlNode,我要求您使用 IDE 的调试模式来确认或拒绝该断言。

标签: c# xml xmldocument


【解决方案1】:

可能是这样的:

    XmlNodeList xnList = xmlDoc.SelectNodes("/Tasks/Task");
    foreach (XmlNode task in xnList)
    {
        taskName = task.Attributes["name"].Value;//Name
        taskType = task.Attributes["type"].Value;//Type
        if(task.HasChildNodes)
        {
            XmlNodeList child = task.ChildNodes();
            if(child != null)
            {
                taskStartTime = child[0].Attributes["starttime"].Value;//starttime
                taskRepeat = child[0].Attributes["repeat"].Value;//rpt
                taskEndTime = child[0].Attributes["endtime"].Value;//endtime
            }
        }
        // Do your output here where you have all the values for a task
        // Make sure you print before the next line, it will clear out the attribute values.
        taskStartTime = taskRepeat = taskEndTime = string.Empty;
    }

【讨论】:

  • 当我输出值时,task1的值很好,但是task2的starttimerepeatendtime和taks1一样。
  • 任务 2 的 taskName 和 taskType 是否正确?
  • 是的,但出现的属性与之前的任务相同。
  • 我将XmlNodeList child = task.SelectNodes("/Occurrence"); 更改为XmlNodeList child = task.SelectNodes("/Tasks/Task/Occurrence"); 然后我能够输出task1 的开始时间等。
  • 试试上面的更新(把task.SelectNodes改成task.ChildNodes)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-09
  • 1970-01-01
  • 1970-01-01
  • 2022-01-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多