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

Jay*_*Jay 5 c# xml xml-namespaces

以下代码完美无缺.请参阅下面的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);
Run Code Online (Sandbox Code Playgroud)

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

<Author xmlns="http://www.w3.org/1999/xhtml">
Run Code Online (Sandbox Code Playgroud)

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

任何帮助将不胜感激.

这是xml文件:

<?xml version="1.0" encoding="UTF-8" ?> 
<Contacts>
<Author>
<FirstName>Joe</FirstName>
</Author>
<Teacher>
<FirstName>Larry</FirstName>
</Teacher>

<Painter>
<FirstName>Mary</FirstName>
</Painter>
</Contacts>
Run Code Online (Sandbox Code Playgroud)

hun*_*ind 7

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


Jon*_*eet 5

您的XPath表达式正在查找没有名称空间的元素"Contacts","Author"和"FirstName" .它看起来像Author元素(和没有命名空间声明子元素)具有命名空间,做你的XPath表达式不匹配.

要修复它,您需要使用an 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);
}
Run Code Online (Sandbox Code Playgroud)