为什么’xmlns’属性会影响XPath节点查找?

以下代码完美无缺。 请参阅下面的XML文件。

XPathDocument xPathDoc = new XPathDocument(@"C:\Authors.xml"); XPathNavigator navigator = xPathDoc.CreateNavigator(); XPathNodeIterator iterator = navigator.Select("/Contacts/Author/FirstName"); iterator.MoveNext(); string firstName = iterator.Current.InnerXml; Console.WriteLine(firstName); 

‘firstName’的值返回’Joe’,这是完美的。 但是,当我将这个attibute xmlns =“http://www.w3.org/1999/xhtml”添加到”标签时,它看起来如下:

  

然后代码没有返回正确的值(’Joe’)为什么然后属性xmlns =“http://www.w3.org/1999/xhtml”影响上面的代码以及我缺少什么来返回正确的值?

任何帮助将不胜感激。

这是xml文件:

    Joe   Larry   Mary   

xmlns是名称空间,用于避免xml标记之间的冲突。 场景,当一个应用程序使用来自多个源的xml且两个或多个xml文件中存在相同的标记名时。 由于这种歧义的可能性很高,因此使用命名空间来减少它。

您的XPath表达式正在查找没有名称空间的元素“Contacts”,“Author”和“FirstName”。 看起来像Author元素(以及没有名称空间声明的任何后代元素)都有名称空间,您的XPath表达式不匹配。

要修复它,您需要使用XmlNamespaceManager ,将前缀与命名空间相关联,并在XPath表达式中包含该命名空间。 坦率地说,它变得混乱。

你有什么理由不能使用LINQ to XML吗? 它使得处理XML以及特别是名称空间变得更加简单。 如果您能够使用它,我很高兴能够提供LINQ to XML示例。

编辑:这是LINQ to XML的一些示例:

 XDocument doc = XDocument.Load("authors.xml"); XNamespace ns = "http://www.w3.org/1999/xhtml"; var query = doc.Root .Elements(ns + "Author") .Elements(ns + "FirstName"); foreach (var element in query) { Console.WriteLine((string) element); }