Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# SelectSingleNode InnerText属性不正确_C#_Xml - Fatal编程技术网

C# SelectSingleNode InnerText属性不正确

C# SelectSingleNode InnerText属性不正确,c#,xml,C#,Xml,我试图为找到的每个父元素获取特定节点的值。 在这个例子中,我想返回每个学生的名字。 相反,我在每个实例中获取第一个元素的名称。学生的InnerText是正确的,但FirstName的InnerText始终是Alex var xml = @"<School> <Students> <Student> <FirstName>Alex&

我试图为找到的每个父元素获取特定节点的值。 在这个例子中,我想返回每个学生的名字。 相反,我在每个实例中获取第一个元素的名称。学生的InnerText是正确的,但FirstName的InnerText始终是Alex

var xml = @"<School>
                <Students>
                    <Student>
                        <FirstName>Alex</FirstName>
                        <LastName>Smith</LastName>
                        <Grade>11</Grade>
                    </Student>
                    <Student>
                        <FirstName>Joanne</FirstName>
                        <LastName>Robins</LastName>
                        <Grade>12</Grade>
                    </Student>
                    <Student>
                        <FirstName>Steve</FirstName>
                        <LastName>Baker</LastName>
                        <Grade>11</Grade>
                    </Student>
                </Students>
                <Teachers>
                    <Teacher>
                        <FirstName>George</FirstName>
                        <LastName>Roberts</LastName>
                        <Grade>11</Grade>
                    </Teacher>
                    <Teacher>
                        <FirstName>Amanda</FirstName>
                        <LastName>Walker</LastName>
                        <Grade>12</Grade>
                    </Teacher>
                    <Teacher>
                        <FirstName>Tracey</FirstName>
                        <LastName>Smith</LastName>
                        <Grade>12</Grade>
                    </Teacher>
                </Teachers>
            </School>";

var doc = new XmlDocument();
doc.LoadXml(xml);

var resourceTypeNodes = doc.GetElementsByTagName("Student");
var resourceTypesIterator = resourceTypeNodes.GetEnumerator();

while (resourceTypesIterator != null && resourceTypesIterator.MoveNext())
{
    var resourceTypeNode = resourceTypesIterator.Current as XmlNode;
    var typeNameElement = resourceTypeNode.SelectSingleNode("//FirstName");

    Console.WriteLine(resourceTypeNode.InnerXml);
    Console.WriteLine(typeNameElement.InnerText);
}
var xml=@”
亚历克斯
史密斯
11
乔安妮
罗宾斯
12
史蒂夫
面包师
11
乔治
罗伯茨
11
阿曼达
散步的人
12
特蕾西
史密斯
12
";
var doc=新的XmlDocument();
doc.LoadXml(xml);
var resourceTypeNodes=doc.GetElementsByTagName(“学生”);
var resourceTypesIterator=resourceTypeNodes.GetEnumerator();
while(resourceTypesIterator!=null&&resourceTypesIterator.MoveNext())
{
var resourceTypeNode=resourceTypesIterator.Current作为XmlNode;
var typenamelement=resourceTypeNode.SelectSingleNode(//FirstName”);
WriteLine(resourceTypeNode.InnerXml);
Console.WriteLine(typenamelement.InnerText);
}
这是上述代码的输出

<FirstName>Alex</FirstName><LastName>Smith</LastName><Grade>11</Grade>
Alex
<FirstName>Joanne</FirstName><LastName>Robins</LastName><Grade>12</Grade>
Alex
<FirstName>Steve</FirstName><LastName>Baker</LastName><Grade>11</Grade>
Alex
11
亚历克斯
乔安娜·罗宾斯12
亚历克斯
史蒂文贝克尔11
亚历克斯

我遗漏了什么?

因为您使用的是
//FirstName
XPath表达式,它将始终从根返回第一个节点,无论您是否在子节点上调用。只要改变这个:

var typeNameElement = resourceTypeNode.SelectSingleNode("//FirstName");
为此:

var typeNameElement = resourceTypeNode.SelectSingleNode("FirstName");
此外,您手动使用
IEnumerator
还有什么具体原因吗?您可以使用
foreach
简化代码:

foreach (XmlNode resourceTypeNode in doc.GetElementsByTagName("Student"))
{
    var typeNameElement = resourceTypeNode.SelectSingleNode("FirstName");

    Console.WriteLine(resourceTypeNode.InnerXml);
    Console.WriteLine(typeNameElement.InnerText);
}

哇!这就是全部,就是双斜杠。谢谢@Adriano,我觉得这有点像从根级别进行查询。就枚举器而言,不,这只是复制粘贴代码,尚未进行重构。一旦我知道它起作用了,我就打算这么做。再次感谢!