对节点匹配列表框项的子节点进行计数

本文关键字:子节点 节点 列表 | 更新日期: 2023-09-27 18:33:50

我在这里遇到选定的索引更改问题。我的xml文件包含模块编号,模块名称,评估,学分等。我在这里试图实现的是 - 一些课程详细信息从 xml(模块名称和代码)加载到列表框中,但当用户选择一个模块时,标签应显示该模块有多少评估。这是我的 XML 文件示例

<module>
    <moduleCode>ECWM618</moduleCode>
    <moduleTitle>Semantic and Social Web</moduleTitle>
    <credits>15</credits>
    <semester>2</semester>
    <assessmentDetails>
      <assessment>
        <assessmentName>Coursework1</assessmentName>
        <assessmentType>Coursework</assessmentType>
        <assessmentWeighting>25</assessmentWeighting>
      </assessment>
      <assessment>
        <assessmentName>Coursework2</assessmentName>
        <assessmentType>Coursework</assessmentType>
        <assessmentWeighting>25</assessmentWeighting>
      </assessment>
      <assessment>
        <assessmentName>Exam</assessmentName>
        <assessmentType>Exam</assessmentType>
        <assessmentWeighting>50</assessmentWeighting>
      </assessment>
    </assessmentDetails>
  </module>

这是我得到的代码

private void moduleSummaryBox_SelectedIndexChanged(object sender, EventArgs e)
        {
            // when module from modulelist is selected, it read all indicies assigned to the module.
            //!!!!!!!! it reads last node only :(?  wtf im tired ...lol 
            //            
                // read data from modulelist
                string path = Directory.GetCurrentDirectory();
                FileStream fs = new FileStream(@"myCourse.xml", FileMode.OpenOrCreate, FileAccess.Read, FileShare.Read);
                XmlReader moduleReader = XmlReader.Create(fs);
                moduleReader.Read();
                while (moduleReader.Read())
                {
                    int assessmentNo = 0;
                    bool match = false;
                    moduleReader.MoveToElement();
                    if (moduleReader.Name == "assessmentName")
                    {
                        moduleReader.Read();// reads xml file.
                        XmlNodeType nType = moduleReader.NodeType; //XmlNodeType Specifies the type of node. If node matches specified name = true.
                        if (nType == XmlNodeType.Text)// if node type match XmlNodeType ( and there is some text in it) statement becomes true
                        {
                            this.assno.Text = (moduleReader.Value.ToString()); //set mcode label to matched node.                            
                        }
                    }
                    if (moduleReader.Value.ToString() == moduleSummaryBox.Items[moduleSummaryBox.SelectedIndex].ToString())
                    {
                        match = true;
                    }
                    if (match == true)
                    {
                        break;                        
                    }

            }
        } 

帮助赞赏谢谢:)

编辑:这是进入列表框的内容

moduleSummaryBox.Items.Clear();
            XmlDocument doc = new XmlDocument();
            doc.Load(@"myCourse.xml");
            XmlNodeList levelList = doc.GetElementsByTagName("level"+l_level);
            foreach (XmlNode node in levelList)
            {
                XmlElement moduleElement = (XmlElement)node;
                XmlNodeList modules_individ = moduleElement.GetElementsByTagName("module");
                foreach (XmlNode nodes in modules_individ)
                {
                    XmlElement moduleSeperator = (XmlElement)nodes;
                    string ll_moduleCode = moduleSeperator.GetElementsByTagName("moduleCode")[0].InnerText;
                    string ll_moduleTitle = moduleSeperator.GetElementsByTagName("moduleTitle")[0].InnerText;                    
                    moduleSummaryBox.Items.Add(ll_moduleCode+" : " + ll_moduleTitle+" ");
                }
            }

对节点匹配列表框项的子节点进行计数

你能试试下面的代码示例吗:-

const string xmlString =
                "<module><moduleCode>ECWM618</moduleCode><moduleTitle>Semantic and Social Web</moduleTitle><credits>15</credits>" +
                "<semester>2</semester><assessmentDetails><assessment><assessmentName>Coursework1</assessmentName><assessmentType>Coursework</assessmentType>" +
                "<assessmentWeighting>25</assessmentWeighting></assessment><assessment><assessmentName>Coursework2</assessmentName><assessmentType>Coursework</assessmentType>" +
                "<assessmentWeighting>25</assessmentWeighting></assessment><assessment><assessmentName>Exam</assessmentName><assessmentType>Exam</assessmentType><assessmentWeighting>50</assessmentWeighting></assessment></assessmentDetails></module>";
            var xml = XElement.Parse(xmlString);
            var qry =
                xml.Descendants()
                    .Where(e => e.Name == "moduleCode" && e.Value == "ECWM618")
                    .Ancestors()
                    .Descendants()
                    .Where(e => e.Name == "assessmentDetails")
                    .Elements("assessment").Count();