SelectSingleNode Node InnerText属性不正确

时间:2014-08-14 08:44:30

标签: c# xml

我试图获取找到的每个父元素的特定节点的值。 在示例中,我想要返回每个学生的名字。 相反,我在每个实例中获得第一个元素名称。学生的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);
}

这是上述代码的输出。

<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

我错过了什么?

1 个答案:

答案 0 :(得分:1)

因为您正在使用//FirstName XPath表达式,它将始终从root返回第一个节点,如果您在子节点上调用它并不重要。只需改变一下:

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);
}