Consultas XPath e namespaces
As consultas XPath reconhecem os namespaces em um documento XML e podem usar prefixos de namespace para qualificar nomes de elementos e atributos. A qualificação de nomes de elemento e atributo com um prefixo de namespace limita os nós retornados por uma consulta XPath somente aos nós que pertencem a um namespace específico.
Por exemplo, se o books
de prefixo for mapeado para o namespace http://www.contoso.com/books
, a seguinte consulta XPath /books:books/books:book
selecionará somente os elementos book
no namespace http://www.contoso.com/books
.
XmlNamespaceManager
Para usar namespaces em uma consulta XPath, um objeto derivado da interface IXmlNamespaceResolver como a classe XmlNamespaceManager será construído com o URI e o prefixo do namespace que serão incluídos na consulta XPath.
O objeto XmlNamespaceManager pode ser usado na consulta das seguintes maneiras.
O objeto XmlNamespaceManager é associado a um objeto XPathExpression existente usando o método SetContext do objeto XPathExpression. Você também pode compilar um novo objeto XPathExpression usando o método Compile estático que usa uma cadeia de caracteres representando a expressão XPath e um objeto XmlNamespaceManager como parâmetros, e retorna um novo objeto XPathExpression.
O próprio objeto XmlNamespaceManager é passado como um parâmetro para um método da classe XPathNavigator de aceitação juntamente com uma cadeia de caracteres que representa a expressão XPath.
Estes são os métodos da classe XPathNavigator que aceitam um objeto derivado da interface IXmlNamespaceResolver como um parâmetro.
O namespace padrão
No documento XML a seguir, o namespace padrão com um prefixo vazio é usada para declarar o namespace http://www.contoso.com/books
.
<books xmlns="http://www.contoso.com/books">
<book>
<title>Title</title>
<author>Author Name</author>
<price>5.50</price>
</book>
</books>
O XPath trata o prefixo vazio como o namespace null
. Em outras palavras, somente os prefixos mapeados para os namespaces podem ser usados em consultas XPath. Isso significa que, se você quiser fazer uma consulta em um namespace em um documento XML, mesmo que ele seja o namespace padrão, será necessário definir um prefixo para ele.
Por exemplo, sem definir um prefixo para o documento XML acima, a consulta XPath /books/book
não retornará nenhum resultado.
Um prefixo deve ser associado para evitar a ambiguidade durante a consulta de documentos com alguns nós que não estão em um namespace e outros que estão em um namespace padrão.
O código a seguir define um prefixo para o namespace padrão e seleciona todos os elementos book
do namespace http://www.contoso.com/books
.
Dim document As XPathDocument = New XPathDocument("books.xml")
Dim navigator As XPathNavigator = document.CreateNavigator()
Dim query As XPathExpression = navigator.Compile("/books:books/books:book")
Dim manager As XmlNamespaceManager = New XmlNamespaceManager(navigator.NameTable)
manager.AddNamespace("books", "http://www.contoso.com/books")
query.SetContext(manager)
Dim nodes As XPathNodeIterator = navigator.Select(query)
XPathDocument document = new XPathDocument("books.xml");
XPathNavigator navigator = document.CreateNavigator();
XPathExpression query = navigator.Compile("/books:books/books:book");
XmlNamespaceManager manager = new XmlNamespaceManager(navigator.NameTable);
manager.AddNamespace("books", "http://www.contoso.com/books");
query.SetContext(manager);
XPathNodeIterator nodes = navigator.Select(query);