Отлично. Большое спасибо. Джей

ющий код работает отлично. Смотрите 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>
 Marc Gravell♦18 янв. 2011 г., 20:18
Короткая версия: пространство имен XML - это очень важно, но не тривиально ...

Ответы на вопрос(2)

без пространств имен, Похоже,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);
}
 Jay18 янв. 2011 г., 22:01
Отлично. Большое спасибо. Джей
 Jay18 янв. 2011 г., 21:48
Джон, Большое спасибо за быстрый ответ на мой вопрос. Я немного прочитал XmlNamespaceManager и понял, что вы имеете в виду под грязным Нет, я открыт для использования LINQ. Было бы здорово, если вы можете опубликовать пример, который делает то же самое
 Jon Skeet18 янв. 2011 г., 21:52
@Jay: Взгляните на мою правку и посмотрите, что вы ищете, или хотя бы начало.

которое используется, чтобы избежать конфликта между тегами xml. Сценарий, когда одно приложение использует XML из нескольких источников и один и тот же тэг существует в двух или более файлах XML. Поскольку вероятность такой неоднозначности высока, пространство имен используется для ее уменьшения.

 user42066711 июн. 2012 г., 20:21
+1 за фактический ответПочему.

Ваш ответ на вопрос