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ů.
Objekt XmlNamespaceManager je přidružen k existujícímu XPathExpression objektu pomocí SetContext metody objektu XPathExpression . Můžete také zkompilovat nový XPathExpression objekt pomocí statické Compile metody, která přebírá řetězec představující výraz XPath a XmlNamespaceManager objekt jako parametry a vrací nový XPathExpression objekt.
Samotný XmlNamespaceManager objekt se předává jako parametr metodě accepting XPathNavigator class spolu s řetězcem představujícím výraz XPath.
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);