以下代码非常完美。请参阅下面的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”添加到''标签时,它看起来如下:
<Author xmlns="http://www.w3.org/1999/xhtml">
然后代码没有返回正确的值('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>
答案 0 :(得分:7)
xmlns是命名空间,用于避免xml标记之间的冲突。场景,当一个应用程序使用来自多个源的xml且两个或多个xml文件中存在相同的标记名时。由于这种歧义的可能性很高,因此使用命名空间来减少它。
答案 1 :(得分:5)
您的XPath表达式正在寻找元素“Contacts”,“Author”和“FirstName” without namespaces 。它看起来像Author
元素(以及没有名称空间声明的任何后代元素) do 具有名称空间,您的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);
}