C# 为什么XPathNodeIterator找不到所需的路径?

C# 为什么XPathNodeIterator找不到所需的路径?,c#,xml,xpath,xpath-2.0,C#,Xml,Xpath,Xpath 2.0,XPathNodeIterator从给定路径获取数据时遇到问题。调试时,pNav拥有xml文件中的所有值。不过,迭代器显示的计数为0。它从不进入while循环。任何帮助都将不胜感激 C XML: 生物学 约翰 雌鹿 898-989-8989 515 我希望输出是 Name = Biology, Code = 240 它需要通过选择方法: const string xml = @" <Courses xmlns=""http://xml"" xmlns:xsi=""http://w

XPathNodeIterator从给定路径获取数据时遇到问题。调试时,pNav拥有xml文件中的所有值。不过,迭代器显示的计数为0。它从不进入while循环。任何帮助都将不胜感激

C

XML:

生物学 约翰 雌鹿 898-989-8989 515 我希望输出是

Name = Biology, Code = 240
它需要通过选择方法:

const string xml = @"
    <Courses xmlns=""http://xml"" xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xsi:schemaLocation=""Courses.xsd"">
        <Course>
            <Code Undergrad=""240""/>
            <Name>Biology</Name>
            <Instructor>
                <Name>
                    <First>John</First>
                    <Last>Doe</Last>
                </Name>
                <Contact>
                <Phone>898-989-8989</Phone>
                </Contact>
            </Instructor>
            <Room>515</Room>
        </Course>
        <Course>
            <Code Undergrad=""000""/>
            <Name>Math</Name>
            <Instructor>
                <Name>
                    <First>John</First>
                    <Last>Doe</Last>
                </Name>
                <Contact>
                <Phone>898-989-8989</Phone>
                </Contact>
            </Instructor>
            <Room>515</Room>
        </Course>
    </Courses>";

using (var stream = new MemoryStream(Encoding.ASCII.GetBytes(xml)))
{
    var pdoc = new XPathDocument(stream);
    var pNav = pdoc.CreateNavigator();

    var manager = new XmlNamespaceManager(pNav.NameTable);
    manager.AddNamespace("cs", "http://xml");

    var iterator = pNav.Select("/cs:Courses/cs:Course", manager);

    foreach (XPathNavigator node in iterator)
    {
        var courseName = node.SelectSingleNode("cs:Name", manager)?.Value;
        var courseCode = node.SelectSingleNode("cs:Code", manager)?.GetAttribute("Undergrad", string.Empty);

        Console.WriteLine("{0} {1}", courseName, courseCode);
    }
}
因为你有

xmlns="http://xml"
在XML文件中,需要添加XmlNamespaceManager,以允许导航器查找节点。如果删除xmlns=http://xml 从XML开始,就不需要使用XmlNamespaceManager

Select方法还返回一个节点集合-您需要调用SelectSingleNode来获取所需的节点。例如

XPathDocument pdoc = new XPathDocument("Courses.xml");
XPathNavigator pNav = pdoc.CreateNavigator();

var manager = new XmlNamespaceManager(pNav.NameTable);
manager.AddNamespace("cs", "http://xml");

XPathNodeIterator iterator = pNav.Select("/cs:Courses/cs:Course", manager);

while(iterator.MoveNext())
{
    var nameNode = iterator.Current.SelectSingleNode("cs:Name", manager);
    string courseName = nameNode.Value;

    var codeNode = iterator.Current.SelectSingleNode("cs:Code", manager);

    codeNode.MoveToFirstAttribute();

    string courseCode = codeNode.Value;
    Console.WriteLine("{0} {1}", courseName, courseCode);
}

当您到达Code元素时,需要移动到第一个属性以获取值,否则value属性将返回空字符串

这不会返回OP期望的字符串。它返回/Courses/Courses下所有节点的文本
XPathDocument pdoc = new XPathDocument("Courses.xml");
XPathNavigator pNav = pdoc.CreateNavigator();

var manager = new XmlNamespaceManager(pNav.NameTable);
manager.AddNamespace("cs", "http://xml");

XPathNodeIterator iterator = pNav.Select("/cs:Courses/cs:Course", manager);

while(iterator.MoveNext())
{
    var nameNode = iterator.Current.SelectSingleNode("cs:Name", manager);
    string courseName = nameNode.Value;

    var codeNode = iterator.Current.SelectSingleNode("cs:Code", manager);

    codeNode.MoveToFirstAttribute();

    string courseCode = codeNode.Value;
    Console.WriteLine("{0} {1}", courseName, courseCode);
}