Поделиться через


Навигация по пространству имен XPath

Чтобы использовать запросы 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.

См. также