Sdílet prostřednictvím


Dotazy a obory názvů XPath

Dotazy XPath vědí o oborech názvů v dokumentu XML a mohou použít předpony oboru názvů k kvalifikace názvů elementů a atributů. Opravňující názvy elementů a atributů s předponou oboru názvů omezují uzly vrácené dotazem XPath pouze na uzly, které patří do konkrétního oboru názvů.

Pokud se například předpona books mapuje na obor názvů http://www.contoso.com/books, pak následující dotaz /books:books/books:book XPath vybere pouze ty book prvky v oboru názvů http://www.contoso.com/books.

The XmlNamespaceManager

Chcete-li použít obory názvů v dotazu XPath, objekt odvozený z IXmlNamespaceResolver rozhraní, jako XmlNamespaceManager je třída, je vytvořen s identifikátorem URI oboru názvů a předponou, která se má zahrnout do dotazu XPath.

Objekt XmlNamespaceManager lze v dotazu použít v každém z následujících způsobů.

Následují metody XPathNavigator třídy, které přijímají objekt odvozený z IXmlNamespaceResolver rozhraní jako parametr.

Výchozí obor názvů

V následujícím dokumentu XML se k deklaraci oboru názvů používá výchozí obor názvů s prázdnou předponou 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>  

XPath považuje prázdnou předponu null za obor názvů. Jinými slovy, v dotazech XPath lze použít pouze předpony mapované na obory názvů. To znamená, že pokud chcete dotazovat na obor názvů v dokumentu XML, i když se jedná o výchozí obor názvů, musíte pro něj definovat předponu.

Například bez definování předpony pro výše uvedený dokument XML dotaz XPath /books/book nevrací žádné výsledky.

Předpona musí být vázána, aby se zabránilo nejednoznačnosti při dotazování dokumentů s některými uzly, které nejsou v oboru názvů, a některé ve výchozím oboru názvů.

Následující kód definuje předponu pro výchozí obor názvů a vybere všechny book prvky z http://www.contoso.com/books oboru názvů.

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);  

Viz také