Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Чтобы использовать запросы XPath с XML-документами, необходимо правильно обращаться к пространствам имен XML и элементам, содержащимся в пространствах имен. Пространства имен предотвращают неоднозначность, которая может возникать при использовании имен в нескольких контекстах; Например, имя ID
может ссылаться на несколько идентификаторов, связанных с различными элементами XML-документа. Синтаксис пространства имен задает URI, имена и префиксы, которые отличают элементы XML-документа.
В примере в этом разделе демонстрируется использование префиксов при взаимодействии с XML-документом с помощью XPathNavigator. Дополнительные сведения о пространствах имен и синтаксисе см. в xml-файлах: общие сведения о пространствах имен XML.
Объявление пространств имен
Объявления пространства имен делают элементы XML-документа различаемыми и адресируемыми при использовании экземпляра XPathNavigator. Префиксы пространства имен предоставляют краткий синтаксис для адресации пространств имен.
Префиксы определяются формой: <e:Envelope xmlns:e=http://schemas.xmlsoap.org/soap/envelope/>.
в этом синтаксисе префикс "e
" является сокращенным для формального URI пространства имен. Вы можете определить элемент Body
как член пространства имен Envelope
, используя синтаксис e:Body
.
Следующий XML-документ будет ссылаться как response.xml
в примере навигации в следующем разделе.
<?xml version="1.0" encoding="utf-8" ?>
<e:Envelope xmlns:e="http://schemas.xmlsoap.org/soap/envelope/">
<e:Body>
<s:Search xmlns:s="http://schemas.microsoft.com/v1/Search">
<r:request xmlns:r="http://schemas.microsoft.com/v1/Search/metadata"
xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
</r:request>
</s:Search>
</e:Body>
</e:Envelope>
Навигация по префиксу пространства имен
Код в этом разделе использует XPathNavigator и XmlNamespaceManager объекты для выбора Search
элемента из XML-документа в предыдущем разделе. Запрос xpath
включает префиксы пространства имен для каждого элемента в пути. Указание точной идентификации пространств имен, содержащих каждый элемент, гарантирует правильную навигацию к элементу Search
с помощью метода SelectSingleNode.
using (XmlReader reader = XmlReader.Create("response.xml"))
{
XPathDocument doc = new XPathDocument(reader);
XPathNavigator nav = doc.CreateNavigator();
XmlNamespaceManager nsmgr = new XmlNamespaceManager(nav.NameTable);
nsmgr.AddNamespace("e", @"http://schemas.xmlsoap.org/soap/envelope/");
nsmgr.AddNamespace("s", @"http://schemas.microsoft.com/v1/Search");
nsmgr.AddNamespace("r", @"http://schemas.microsoft.com/v1/Search/metadata");
nsmgr.AddNamespace("i", @"http://www.w3.org/2001/XMLSchema-instance");
string xpath = "/e:Envelope/e:Body/s:Search";
XPathNavigator element = nav.SelectSingleNode(xpath, nsmgr);
Console.WriteLine("Element Prefix:" + element.Prefix +
" Local name:" + element.LocalName);
Console.WriteLine("Namespace URI: " + element.NamespaceURI);
}
Точность полных квалифицированных пространств имен и имен — это больше, чем просто удобство. Небольшое экспериментирование с определением документа и кодом в предыдущих примерах проверяет, что навигация без полных имен элементов вызывает исключения. Например, определение элемента: <Search xmlns="http://schemas.microsoft.com/v1/Search">
, и запрос: строка xpath = "/s:Envelope/s:Body/Search";
без префикса пространства имен на элементе Search
возвращает null
вместо элемента Search
.