0

我无法从控制台输入的值中列出正确的值。我的 XML 文件是:

<Students>
  <Student>
    <Name>Name1</Name>
    <Surname>Surname1</Surname>
    <Index>2222</Index>
    <Subject name="History">
      <Class>Class2</Class>
      <Status status="passed">
        <Grade>A</Grade>
      </Status>
    </Subject>
  </Student>
  <Student>
    <Name>Name2</Name>
    <Surname>Surname2</Surname>
    <Index>3333</Index>
    <Subject name="Math">
      <Class>Class3</Class>
      <Status status="passed">
        <Grade>D</Grade>
      </Status>
    </Subject>
  </Student>
</Students>

所以我想做的是当我输入例如 3333 时,我想列出学生所属的班级,在这种情况下是“Class3”。我的代码是这样的:

    XmlDocument xmlDoc = new XmlDocument();
    xmlDoc.Load("Students.xml");

    Console.WriteLine("\nInsert Index Number");
    string result = Console.ReadLine();

    XmlNodeList xnList = xmlDoc.SelectNodes("//Student/Index");

    XmlNodeList xnList2 = xmlDoc.SelectNodes("//Student/Subject/Class");
    string result2 = null;
    for (int i = 0; i < xnList.Count; i++)
    {
        string nodeval = xnList[i].InnerText;
        if (nodeval == result)
        for (int j = 0; j < xnList2.Count; j++)
        {
                result2 = xnList2[j].InnerText;
                Console.WriteLine("Result" + result2);
        }
    }

}

有什么帮助吗?谢谢

4

1 回答 1

0

下面是你的答案。这基本上说你想要所有类节点,它有一个值为“3333”的父索引节点。您无需使用 2 个节点集执行嵌套 FOR 循环即可找到匹配项。

 /Students/Student//Class[../..//Index[.="3333"]]
 or
 /Students/Student//Class[../../Index[.="3333"]]
 or
 //Student//Class[../../Index[.="3333"]]

您可以在 URL http://www.xpathtester.com/test上对此进行测试,将 我的 XPath 表达式粘贴到 XPath 文本框中,并将您的 XML 粘贴到 XML 大文本框中,然后单击“测试!” 按钮。

如果你需要完整的源代码,它在下面。关键是创建正确的 XPATH 表达式并使用您称为“索引”的不同值进行字符串替换/连接。这将返回所有 Class 节点,其值从您调用 Index 的命令行输入。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.Load("Students.xml");

            Console.WriteLine("\nInsert Index Number");
            string index = Console.ReadLine();

            //the critical piece is here, creating the correct xpath expression
            string xPathString = String.Format("/Students/Student//Class[../..//Index[.=\"{0}\"]]", index);

            XmlNodeList nodeList = xmlDoc.SelectNodes(xPathString);
            foreach (XmlNode node in nodeList)
            {
                Console.WriteLine("Index: {0} Class: {1}", index, node.InnerText);
            }
            Console.ReadLine();
        }
    }

}

于 2014-01-30T03:00:50.267 回答